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

FreeBSD Manual Pages

  
 
  

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

NAME
     ukcprog - Library of utilities for C programmers

SYNOPSIS
     In source code,

	    #include <ukcprog.h>

     and link with

	    cc ... -lukcprog

AVAILABILITY
     This  is  a  UKC library, available for the UNIX and VMS operating systems,
     and for MS-DOS.  The source code is freely available so if you want to make
     a source release of your application you can include a copy of  the  source
     of this library as well.

DESCRIPTION
     The  ukcprog  library  contains  generally  useful low level routines.  The
     ukcprog.h header file contains prototypes	for  the  routines  as	well  as
     defining some useful macros and types.

	    #ifdef __STDC__
	    #define PROTO(a)	a
	    typedef void *voidptr;
	    #else
	    #define PROTO(a)	()
	    #define const
	    #define volatile
	    #define signed
	    typedef char *voidptr;
	    #endif

     The  definitions  of const, volatile and signed allow these ANSI C keywords
     to be used in code which must be portable to pre-ANSI C compilers.

     The voidptr typedef is similarly there to help with code for pre-ANSI  com-
     pilers  which  do not support the `void *' type.  Functions which are docu-
     mented here as returning `void *' return `char *'	when  compiling  with  a
     non-ANSI C compiler.

     The  PROTO  macro	is useful for declaring function prototypes for use with
     ANSI C while still allowing the code to be compiled with K&R compilers.  It
     is used thus:

	    int myfunc PROTO((int arg1, char *arg2));

     With an ANSI C compiler this expands to

	    int myfunc (int arg1, char *arg2);

     whereas a pre-ANSI compiler sees:

	    int myfunc ();

     Note the double brackets; these are necessary to make all the parameters  a
     single argument to the PROTO macro.

	    #ifndef FALSE
	    #define FALSE   0
	    #endif
	    #ifndef TRUE
	    #define TRUE    1
	    #endif
	    #ifndef bool
	    #define bool int
	    #endif

     These define the commonly used TRUE and FALSE macros to their usual values.
     The  definitions are protected in case these are already defined.	The bool
     macro is intended to be used to declared variables  that  are  conceptually
     boolean.	A  #define is used rather than a typedef because there might al-
     ready be a typedef for bool.

	    #ifdef __STDC__
	    #define CAT(a,b)	    a ## b
	    #else
	    #define _IDENT(a) a
	    #define CAT(a,b) _IDENT(a)b
	    #endif /* !__STDC__ */

     The CAT macro can be used to glue two tokens together in the  same  way  as
     the  ANSI C ## operator.  CAT also works with many (but not all) pre-ANSI C
     preprocessors.

	    void panic(const char *message)

	    typedef void (*panic_handler_t)(const char *message);
	    panic_handler_t install_panic_handler(panic_hander_t handler)

     By default panic() produces a message on stderr of the form

	    fatal internal error: something (aborting)...

     It then calls abort(3) to produce a core  dump.   Alternative  `panic  han-
     dlers'  can  be  installed  using install_panic_handler() which returns the
     previous handler.	Panic handlers can perform tidy-up tasks, such as remov-
     ing temporary files or calling chdir(2) to arrange for the core to land  in
     a	safe  place.   If a panic handler is called and returns then the default
     action is carried out.

	    void *e_malloc(size_t size)
	    void *e_realloc(void *old, size_t size)
	    char *strsave(const char *str)

     e_malloc() and e_realloc() are error-checking versions of the corresponding
     routines in the standard C library.   They  call  panic()	if  the  request
     fails.   e_realloc()  behaves according to the ANSI specification for real-
     loc(); that is, if old is NULL it behaves like malloc() and if size  is  0,
     it  behaves like free().  strsave() allocates some memory using e_malloc(),
     copies str into it, and returns a pointer to the copy.

	    char *fpgetline(FILE *fp)

     fpgetline() reads characters from the standard IO stream fp until a newline
     character or EOF is encountered.  fpgetline() returns NULL if EOF or an er-
     ror occurred before any  characters  were	read;  otherwise  it  returns  a
     pointer  to  the  NUL terminated line.  fpgetline() never adds a newline to
     the buffer.  The user can check for a missing final newline in  a	file  by
     checking the EOF flag of the stream pointer when fpgetline() returns a non-
     NULL pointer.

     When  fpgetline()	returns  NULL  the  caller  should  check with ferror(3)
     whether the cause was EOF or an error reading the stream fp.

     fpgetline() returns a pointer to a static buffer that is resized as  neces-
     sary  to  handle  long  lines.   The  caller can modify the contents of the
     buffer but must not free it or realloc it.  The buffer is valid only  until
     the next call of fpgetline().

	    char *config_trim_line(char *line)

     config_trim_line()  trims	comments  and  white space in place from a line.
     First it scans for the first `#' character in the line.  If there is one it
     is removed along with any following characters.  Then leading and	trailing
     whitespace  characters  (as  defined  by  isspace(3))  are  removed.   con-
     fig_trim_line() returns a pointer to the trimmed  line  (which  will  point
     into the line that it was given).

     A	typical  use  of this routine is to skip blank lines and comments from a
     configuration file.

	    typedef void (*errf_ofunc_t)(const char *string);

	    void errf(const char *fmt, ...)
	    char *strf(const char *fmt, ...)

	    errf_ofunc_t errf_set_ofunc(errf_ofunc_t func)
	    const char *errf_set_prefix(const char *prefix)
	    const char *errf_get_prefix(void)
	    void_errf_set_progname(const char *progname)
	    const char *errf_get_progname(void)
	    char *formf(char *buffer, int buffer_size,
			const char *format, va_list args)
	    void errf_usage(const char *usage)

     These routines form the basis  of	a  generalised	error  handling  system.
     errf()  formats  an error message, much like printf(3), but then passes the
     formatted text to the `current output function'.  The default output  func-
     tion  appends a newline to the message and sends it to stderr.  An alterna-
     tive output function can be installed with errf_set_ofunc(); it returns the
     old one which can be re-installed as required.  The default output function
     can optionally prefix the message with a fixed string; this can be inserted
     with errf_set_prefix().  A pointer to the current	prefix	is  returned  by
     errf_get_prefix().   By convention, this prefix is derived from the name of
     the program.  errf_set_progname() is  a  convenience  routine  which,  when
     passed  argv[0],  munges  it in an operating system specific way to produce
     the program name and sets the prefix to something	that  looks  `nice'.   A
     pointer   to   the   program  name  (after  munging)  can	be  obtained  by
     errf_get_progname().  A usage line can be sent to the current output  func-
     tion by errf_usage(); it prefixes

	    Usage: progname

     to its argument, and exits with status 1.

     strf() formats a string in the same way as errf(), but returns a pointer to
     a buffer obtained from malloc(3) that contains the result.

     formf()  is  used	in  the internal implementation of errf() and strf() and
     logf() (see below) and is not for the faint-hearted.  It  is  made  visible
     because it is useful if you need to implement other errf()-style functions.
     In  addition  to the normal format conversions, formf() provides `%m' which
     inserts an error message corresponding to the current value of  errno  into
     the output string.

	    int logf_set_ofile PROTO((const char *filename, const char *prefix));
	    void logf(int level, const char *fmt, ...)
	    int logf_set_level PROTO((int level));
	    void logf_errf_ofunc PROTO((const char *str));

     These  routines are an alternative to syslog (3) for applications that need
     to log messages to a specified file.  logf() handles the fmt format  string
     and  arguments  in the same same way as errf().  If there has been no prior
     call to logf_set_ofile() (see below) the message is  displayed  on  stderr,
     prefixed with the current date and time.  If the output is going to a file,
     logf()  tries  to	ensure that messages from multiple processes to a single
     log file are interleaved correctly.

     The level argument specifies the class of the message; it is one of  LG_DE-
     BUG,  LG_INFO,  or  LG_ERR (which are in increasing numerical order).  Mes-
     sages at a level less than the current log level are  discarded.	The  de-
     fault  log  level	is  LG_INFO; it can be set using logf_set_level(), which
     also returns the previous log level.  The log levels LG_ALL and LG_LOG  are
     valid  only in calls to logf_set_level(); LG_ALL means log all messages and
     LG_LOG means log only messages relating to logf() itself.

     logf_set_ofile() sets the output file for logf() messages.  If the log file
     does not exist logf_set_ofile() attempts to  create  it;  otherwise  it  is
     opened  for writing (without discarding any existing contents).  If the at-
     tempt to create or open the file fails,  logf_set_ofile()	gives  an  error
     message  and returns -1, otherwise it returns zero.  If the prefix argument
     is not NULL, the string specified is prepended to all future log  messages.
     logf_set_ofile() makes a copy of the string so it need not be preserved af-
     ter the call.

     logf_errf_ofunc()	logs  the message str at level LG_ERR.	It can be passed
     as an output function to errf_set_ofunc() to arrange that	all  error  mes-
     sages are sent to a log file.

     ssplit()  splits  a  string into a vector of words, treating occurrences in
     the string of any of the characters in the delimiters string as word  sepa-
     rators.

     If the delimiters string starts with a NUL character then multiple adjacent
     delimiters  and leading delimiters generate zero length fields.  Otherwise,
     leading delimiter characters are skipped and multiple  adjacent  delimiters
     are treated as a single delimiter.  Thus

	    char **words = ssplit(line, " \t");

     will to a shell-like split of a command line into words, and

	    char **fields = ssplit(pwline, "\0:");

     would be good for splitting lines from the password file.

     ssplit()  returns	a  NULL  terminated vector of words.  The space for this
     vector and the pointed to words is allocated with a (single) call to e_mal-
     loc().  ssplit() thus never returns NULL; it aborts the program by  calling
     panic() if memory runs out.

     The vector returned by ssplit() should be freed when it is finished with by
     passing it to free().

	    int get_host_addr(const char *hostname, struct in_addr *p_addr)

     get_host_addr() looks up the IP address of hostname using gethostbyaddr(3).
     If  the  lookup  succeeds	it sets *p_addr to the IP address of the host in
     network byte order.  If the lookup fails it gives	an  error  message  with
     errf()  and returns -1.  If hostname consists of four decimal numbers sepa-
     rated by dots then get_host_addr parses this as an IP  quad  and  does  not
     call gethostbyname.

	    int get_service_port(const char *servname, int *p_port)

     get_service_port looks up the port number of the TCP service servname using
     getservbyname(3).	 If  it  succeeds  it sets *p_port to the port number in
     network byte order.  Otherwise it gives an error message  with  errf()  and
     returns -1.  If servname is an ASCII decimal number then get_service_port()
     returns that number (again in network byte order).

	    ebuf_t *ebuf_create(bool errors_are_fatal);
	    void ebuf_reset(ebuf_t *eb);
	    ebuf_t *ebuf_start(ebuf_t *eb, bool errors_are_fatal);
	    int ebuf_add(ebuf_t *eb, const char *buf, int count);
	    char *ebuf_get(ebuf_t *eb, int *p_len);
	    void ebuf_free(ebuf_t *eb);

     These  routines  implement  variable sized contiguous buffers to which data
     can be appended at any time.   ebuf_create()  creates  a  new  zero  length
     buffer.  The errors_are_fatal parameter controls the handling of errors; if
     it is TRUE then all of the routines will call panic() on failure.

     ebuf_add()  appends  count bytes of memory pointed at by data to the buffer
     eb (which must have been created using ebuf_create()).  ebuf_add()  returns
     zero on success.  On failure it panics or returns -1 (depending on the set-
     ting of errors_are_fatal in the call of ebuf_create()).

     ebuf_get()  returns  a  pointer to the current contents of eb; if the p_len
     parameter is not NULL the current length of the buffer in bytes  is  stored
     there.   The  returned buffer and length are only valid up to the next call
     of ebuf_add(), ebuf_reset() or ebuf_free().

     ebuf_reset() frees the data associated with eb and  resets  the  length  to
     zero.   Furthur  calls  of  ebuf_add() can be used to add fresh data to eb.
     ebuf_free() frees and destroys eb.

     ebuf_start() is a convenience routine which  either  creates  or  resets  a
     buffer.   If  eb  is NULL it calls ebuf_create() with the supplied value of
     errors_are_fatal.	If eb is not NULL then it  is  passed  to  ebuf_reset().
     The routine is intended to be used like for static buffers in the following
     way:

	    void foo(void)
	    {
		 static ebuf_t *eb = NULL;

		 eb = ebuf_start(eb, TRUE);
		 ...
	    }

     The  first time the function is called the buffer is created; on subsequent
     calls it is reset.

	    alloc_pool_t *alloc_create_pool(void)

	    void *alloc(alloc_pool_t *ap, int nbytes)
	    void *alloc_ck(alloc_pool_t *ap, int nbytes)

     alloc_create_pool() creates a memory allocation `pool' and returns a handle
     referring to it.  alloc() allocates memory  like  malloc(3)  but  from  the
     specified	pool rather from the general malloc arena.  alloc() calls e_mal-
     loc() to obtain memory in reasonably large  chunks  when  necessary.   This
     means  that  it  never  returns NULL; the program is aborted via panic() if
     there is insufficient memory to satisfy the request.  The	alternative  in-
     terface  alloc_ck()  returns NULL if it runs out of memory; it is otherwise
     identical to alloc().  Memory obtained with alloc() cannot be  freed  indi-
     vidually; only entire pools can be freed.

	    void alloc_free_pool(alloc_pool_t *ap)
	    void alloc_reset_pool(alloc_pool_t *ap)

     alloc_free_pool()	frees an alloc pool, releasing all memory allocated from
     it with alloc().  The pool is no longer valid after this  call.   alloc_re-
     set_pool()  conceptually  frees  all  the memory associated with a pool but
     does not return it via free().  The pool remains valid and subsequent calls
     to alloc() allocate memory from the existing  memory  associated  with  the
     pool if possible.

     These routines are suitable for applications which make lots of small allo-
     cations  for  a  data structure which is to be freed in one go.  alloc() is
     much faster than malloc() as it does not do the bookkeeping to support  in-
     dividual  freeing of allocated memory.  It also has no space overhead other
     than that necessary to correctly align objects in memory.

     alloc_create_pool() is a lightweight routine - it involves a single call to
     malloc() plus some assignments to initialise the pool header structure.  It
     is thus reasonable to use the alloc() routines in	situations  where  there
     are only going to be a few tens of calls to alloc().

	    bool alloc_set_default_debug_flag(bool val)
	    bool alloc_set_debug_flag(alloc_pool_t *ap, bool val)

     By  default  all  memory obtained with alloc() and related routines is ini-
     tialised to the repeated  byte  0x53.   When  memory  is  freed  (with  al-
     loc_free_pool(),  alloc_reset_pool()  or  alloc_release()) it is set to the
     repeated byte 0x42.  This is intended  to	trap  erroneous  use  of  unini-
     tialised  data  and  data that has been freed - newly allocated memory con-
     tains obvious garbage and freed memory is immediately stamped on.

     Of course these safety features cost speed, so they can be turned off glob-
     ally or per-pool.	alloc_set_debug_flag() sets the  debugging  flag  for  a
     pool;  memory will be initialised to garbage and stamped on when freed only
     of the flag is non-zero.  alloc_set_default_debug_flag() sets the value  of
     the  flag	used  for  pools  created from then on with alloc_create_pool().
     Both routines return the previous value of the flag they set.

	    char *allocstr(alloc_pool_t *ap, int nbytes)
	    char *allocstr_ck(alloc_pool_t *ap, int nbytes)

     allocstr() is like alloc() except that it assumes that no alignment is  re-
     quired.  It is thus suitable only for allocating space for strings.  alloc-
     str() is implemented such that interspersed calls to alloc() and allocstr()
     will  pack both the strings and the other objects tightly in memory with no
     space wasted on alignment.  allocstr() never returns NULL - it panics  like
     alloc() if there is no memory.  allocstr_ck() is the same as allocstr() ex-
     cept that it returns NULL if there is no memory.

	    char *alloc_strdup(alloc_pool_t *ap, const char *s)

     alloc_strdup() is a convenience routine that returns a pointer to a copy of
     a	string	allocated using allocstr().  Note that it will never return NULL
     as it uses allocstr() rather than allocstr_ck().

	    alloc_mark_t *alloc_mark(alloc_pool_t *ap)
	    void alloc_release(alloc_pool_t *ap, alloc_mark_t *am)

     alloc_mark() returns an opaque handle that `remembers' the current position
     in an alloc pool.	A subsequent call to alloc_release() conceptually  frees
     all  memory  allocated  from  the	pool since the corresponding call of al-
     loc_mark().  Subsequent calls to alloc() et al will reuse the freed memory.
     A call to alloc_release() renders invalid any marks that were returned  af-
     ter  the alloc_mark() call that returned the mark being passed to alloc_re-
     lease().

	    const char *ukcprog_version(void)

     ukcprog_version() returns a string giving the current version number of the
     library.

BUGS
     This library treads rather freely on the name space.

AUTHORS
     Godfrey Paul
     Mark Russell

     Computing Laboratory, University of Kent at Canterbury.
     Contact: cs-sysadmin@ukc.ac.uk

UKC Local			  February 1991 		      UKCPROG(3)

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

home | help