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

FreeBSD Manual Pages

  
 
  

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

NAME
       libfth -- Forth script and extension language library

LIBRARY
       library "libfth"

SYNOPSIS
       #include	<fth.h>

DESCRIPTION
       This is the Fth library manual page.  One can include Fth library func-
       tions  in  applications	and  in	 C extension libraries.	 The following
       shows example for each:

   Hello-World application:
	     % cat hello.c
	     #include <fth.h>
	     int
	     main(int argc, char *argv[])
	     {
		 fth_init();
		 fth_printf("%s, World%c\n", "Hello", '!');
		 return	(EXIT_SUCCESS);
	     }
       Compile and link	it with:
	     % cc -I/usr/local/include/fth -c hello.c
	     % cc hello.o -o hello -L/usr/local/lib -lfth -lm
       A test run looks	like this:
	     % ./hello => Hello, World!

   Hello-World library:
	     % cat libhello.c
	     #include <fth.h>

	     /*
	      *	hello-prim ( str1 -- str2 )
	      *	intro hello-prim => "Hello, World!"
	      */
	     static void
	     ficl_hello_primitive(ficlVm *vm)
	     {
		 FTH intro, world, result;

		 FTH_STACK_CHECK(vm, 1,	1);
		 intro = fth_pop_ficl_cell(vm);
		 world = fth_variable_ref("world");
		 result	= fth_make_string_format("%S, %S!", intro, world);
		 fth_push_ficl_cell(vm,	result);
	     }

	     /*
	      *	hello-proc ( str1 -- str2 )
	      *	intro hello-proc => "Hello, World!"
	      */
	     static FTH
	     fth_hello_procedure(FTH intro)
	     {
		 FTH world, result;

		 world = fth_variable_ref("world");
		 result	= fth_make_string_format("%S, %S!", intro, world);
		 return	(result);
	     }

	     void
	     Init_libhello(void)
	     {
		 fth_define_variable("intro",
		     fth_make_string("Hello"), NULL);
		 fth_define_constant("world",
		     fth_make_string("World"), NULL);
		 FTH_PRI1("hello-prim",
		     ficl_hello_primitive, NULL);
		 FTH_PROC("hello-proc",
		     fth_hello_procedure, 1, 0,	0, NULL);
	     }
       Compile and link	it with:
	     % cc -fPIC	-I/usr/local/include/fth -c libhello.c
	     % cc -shared -o libhello.so libhello.o -L/usr/local/lib -lfth -lm
       Installing isn't	necessarily required for testing.  Start fth and  load
       the new library with
	     dl-load ./libhello.so Init_libhello
       or start	fth and	load the library direct	from the command line
	     % fth -S "./libhello.so Init_libhello"
       The  new	 words hello-prim and hello-proc as well as the	variable intro
       and the constant	world are available.  In the  following,  `%'  is  the
       shell prompt and	`ok' is	the forth prompt
	     % fth -Qq
	     ok	dl-load	./libhello.so Init_libhello
	     ok	intro hello-prim => "Hello, World!"
	     ok	intro hello-proc => "Hello, World!"
	     ok	"Goodbye" to intro
	     ok	intro hello-prim => "Goodbye, World!"
	     ok	"Bye" hello-proc => "Bye, World!"
	     ok	bye
	     %
       Or test it from the command line:
	     % fth -S "./libhello.so Init_libhello" \
		 -e 'intro hello-prim .	cr' \
		 -e 'intro hello-proc .	cr' \
		 -e '"Goodbye" to intro' \
		 -e 'intro hello-prim .	cr' \
		 -e '"Bye" hello-proc .	cr'
       If the new library is finished, one can install it with
	     % fth -ve "install	libhello.so" -e	""
       After installing	you can	load your new library with
	     dl-load libhello Init_libhello

   Array Object	Type
       A short Array Object Type example in C:
	     FTH ary = fth_make_array_var(2, FTH_ZERO, FTH_ONE);

	     fth_array_length(ary);	     =>	2
	     fth_array_ref(ary,	0);	     =>	0
	     fth_array_push(ary, FTH_TWO);   =>	#( 0 1 2 )
	     fth_array_length(ary);	     =>	3
	     fth_array_shift(ary);	     =>	0
	     fth_array_shift(ary);	     =>	1
	     fth_array_shift(ary);	     =>	2
	     fth_array_length(ary);	     =>	0

	     FTH ary_each(FTH val, FTH data, ficlIndex idx)
	     {
		 return	(fth_string_sformat(data, "array[%d]: %S\n", idx, val));
	     }

	     FTH ary_map(FTH val, FTH data)
	     {
		 return	(fth_number_mul(val, data));
	     }

	     ary = fth_make_array_var(3, FTH_ZERO, FTH_ONE, FTH_TWO);

	     fth_array_each_with_index(ary, ary_each, fth_make_empty_string());
					     =>	"array[0]: 0\n ..."
	     fth_array_map(ary,	ary_map, INT_TO_FIX(10));
					     =>	#( 0 10	20 )
       int FTH_ARRAY_P(obj)
	    Returns 1 if obj is	an Array object, otherwise 0.
       FTH fth_array_append(FTH	array1,	FTH array2)
	    Appends  two  arrays and returns new one.  If array2 is not	an ar-
	    ray, appends it as a single	element.
       void fth_array_clear(FTH	array)
	    Clears array and sets all elements to #f.
       FTH fth_array_compact(FTH array)
	    Returns Array object with all nil elements removed.
       FTH fth_array_copy(FTH array)
	    Returns copy of array with all elements new	created	in contrast to
	    "fth_array_to_array".
       FTH fth_array_delete(FTH	array, ficlInteger index)
	    Deletes and	returns	one element  from  array  at  position	index.
	    Negative  index  counts from backward.  Raises out-of-range	excep-
	    tion if index is not in array's range.
       FTH fth_array_delete_key(FTH array, FTH key)
	    Deletes and	returns	key from array if found, or #f.
       FTH fth_array_each(FTH array, FTH (*func)(FTH  value,  FTH  data),  FTH
	    data)
	    Loops through entire array and calls func on each element.
		  /*
		   * #(	0 1 ) value ary
		   * each { val	}
		   *	 "%s\n"	#( val ) fth-print
		   * end-each
		   */
		  static FTH ary_each(FTH val, FTH data)
		  {
		      fth_printf("%S\n", val);
		      return (data);
		  }

		  fth_array_each(hs, ary_each, FTH_NIL);
       FTH  fth_array_each_with_index(FTH  array,  FTH	(*func)(FTH value, FTH
	    data, ficlInteger idx), FTH	data)
	    Loops through entire array and calls func  on  each	 element  with
	    current index.
		  /*
		   * #(	0 1 ) value ary
		   * each { val	}
		   *	 "%d: %s\n" #( i val ) fth-print
		   * end-each
		   */
		  static FTH ary_each(FTH val, FTH data, ficlInteger idx)
		  {
		      fth_printf("%d: %S\n", idx, val);
		      return (data);
		  }

		  fth_array_each_with_index(hs,	ary_each, FTH_NIL);
       int fth_array_equal_p(FTH obj1, FTH obj2)
	    Returns  1	if  obj1 and obj2 are Array objects of same length and
	    contents, otherwise	0.
       FTH fth_array_fill(FTH array, FTH value)
	    Sets all elements of array to value.
       FTH fth_array_find(FTH array, FTH key)
	    Returns key	if key exists in array.
       ficlInteger fth_array_index(FTH array, FTH key)
	    Returns index of key in ary, or -1 if not found.
       FTH fth_array_insert(FTH	array, ficlInteger index, FTH value)
	    Inserts value to array at position index and returns  changed  ar-
	    ray.   value can be	any single object or an	array.	Negative index
	    counts from	backward.  Raises out-of-range exception if  index  is
	    not	in array's range.
       FTH fth_array_join(FTH array, FTH sep)
	    Returns  string  with  all	elements  of  array converted to their
	    string representation and joined together separated	 by  sep.   If
	    sep	is not a string, a space will be used as separator.
       ficlInteger fth_array_length(FTH	obj)
	    Returns length if obj is an	Array object, otherwise	-1.
       FTH  fth_array_map(FTH  array,  FTH  (*func)(FTH	 value,	FTH data), FTH
	    data)
	    Runs func for each element.	 func's	return value is	the new	 value
	    at current index.
		  /*
		   * #(	0 1 ) map
		   *	 *key* 10 +
		   * end-map =>	#( 10 11 )
		   */
		  static FTH ary_map(FTH val, FTH data)
		  {
		      return (fth_number_add(val, data));
		  }

		  fth_array_map(ary, ary_map, INT_TO_FIX(10));
		      => #( 10 11 )
       int fth_array_member_p(FTH array, FTH key)
	    Returns 1 if key exists in ary, otherwise 0.
       FTH fth_array_pop(FTH array)
	    Removes and	returns	last element of	array.	If array is empty, re-
	    turns #f.
       FTH fth_array_push(FTH array, FTH value)
	    Appends value, which may be	any object, to array.
       FTH fth_array_ref(FTH array, ficlInteger	index)
	    Returns  element  at  position  index.  Negative index counts from
	    backward.  Raises  out-of-range  exception	if  index  is  not  in
	    array's range.
       FTH fth_array_reject(FTH	array, FTH proc_or_xt, FTH args)
	    Calls  proc-or-xt  with the	current	array element as first arg and
	    the	rest from args,	an array of zero or more proc arguments.   The
	    length  of	args + 1 is the	required arity of proc-or-xt.  If args
	    is nil, an empty array is used, if is any other object,  wraps  it
	    in	an  array  of length 1.	 Removes all elements from array where
	    proc-or-xt results not in #f, nil, or 0.
		  /*
		   * #(	0 1 2 3	4 ) lambda: <{ n1 n2 --	f }>
		   *	 n1 n2 >
		   * ; #( 2 ) array-reject! => #( 0 1 2	)
		   * \ or a bit	shorter:
		   * #(	0 1 2 3	4 ) <'>	> 2 array-reject! => #(	0 1 2 )
		   */
		  FTH prc = fth_proc_ref(">");
		  FTH ary = fth_make_array_var(5,
		      FTH_ZERO,	FTH_ONE, FTH_TWO, FTH_THREE, FTH_FOUR):
		  fth_array_reject(ary,	prc, FTH_TWO);	  => #(	0 1 2 )
       FTH fth_array_reverse(FTH array)
	    Returns array in reversed order.
       FTH fth_array_set(FTH array, ficlInteger	index, FTH value)
	    Stores value at position index and returns value.  Negative	 index
	    counts  from  backward.  Raises out-of-range exception if index is
	    not	in array's range.
       FTH fth_array_shift(FTH array)
	    Removes and	returns	first element of array.	 If  array  is	empty,
	    returns #f.
       FTH fth_array_sort(FTH array, FTH proc_or_xt)
	    Returns  sorted  array.   proc-or-xt compares two elements A and B
	    and	should return a	negative integer if A <	B, 0 if	A == B,	and  a
	    positive  integer  if  A  >	 B.   Raises  bad-arity	 exception  if
	    proc-or-xt doesn't take two	arguments.
		  FTH ary_sort(FTH a, FTH b)
		  {
		      if (fth_number_less_p(a, b))
			  return (FTH_ONE_NEG);
		      if (fth_number_equal_p(a,	b))
			  return (FTH_ZERO);
		      return (FTH_ONE);
		  }
		  FTH prc = fth_make_proc_from_func("int-sort",	ary_sort, 0, 2,	0, 0);
		  FTH ary = fth_make_array_var(3, FTH_TWO, FTH_ONE, FTH_ZERO);
		  fth_array_sort(ary, prc); => #( 0 1 2	)
       FTH fth_array_subarray(FTH array, ficlInteger start, ficlInteger	end)
	    Returns array built	from array beginning with index	 start	up  to
	    and	 excluding  index  end.	  Negative index counts	from backward.
	    Raises out-of-range	exception if start is not in ary's range.
       FTH fth_array_to_array(FTH array)
	    Returns copy of array only with references of each element in con-
	    trast to "fth_array_copy".	If array is not	an array,  returns  #(
	    array ).
       FTH fth_array_to_list(FTH obj)
	    Returns  copy  of obj as list only with references of each element
	    in contrast	to "array-copy".  If obj is not	an array,  returns  '(
	    obj	).
       FTH fth_array_uniq(FTH array)
	    Returns array without duplicated elements.
       FTH fth_array_unshift(FTH array,	FTH value)
	    Preprends value to array.
       FTH fth_make_array_len(ficlInteger len)
	    Returns Array object with len entries.
       FTH fth_make_array_var(ficlInteger len, ...)
	    Returns  Array  object  with  len entries, initialized with	values
	    taken from the function argument list.
       FTH fth_make_array_with_init(ficlInteger	len, FTH init)
	    Returns Array object with len entries each initialized to init.
       FTH fth_make_empty_array(void)
	    Returns an empty Array object with length 0.

   Assoc Object	Type
       FTH fth_array_assoc(FTH assoc, FTH key)
	    If key matches, returns corresponding  key-value  pair,  otherwise
	    #f.
       FTH fth_array_assoc_ref(FTH assoc, FTH key)
	    If key matches, returns corresponding value, otherwise #f.
       FTH fth_array_assoc_remove(FTH assoc, FTH key)
	    If	key  matches, removes key-value	pair from assoc.  Returns cur-
	    rent assoc.
       FTH fth_assoc(FTH assoc,	FTH key, FTH value)
       FTH fth_array_assoc_set(FTH assoc, FTH key, FTH value)
	    If key matches, sets key-value pair, otherwise adds	 new  pair  to
	    assoc.  Returns current assoc.

   List	Object Type
       int FTH_LIST_P(obj)
	    Returns 1 if obj is	a list (nil or List object), otherwise 0.
       int FTH_CONS_P(obj)
       int FTH_PAIR_P(obj)
	    Return 1 if	obj is a List object, otherwise	0.
       FTH fth_car(FTH list)
       FTH fth_cadr(FTH	list)
       FTH fth_caddr(FTH list)
       FTH fth_cadddr(FTH list)
	    First,  second, third, or fourth element of	list or	nil if list is
	    shorter.
       FTH fth_cdr(FTH list)
       FTH fth_cddr(FTH	list)
	    Rest, the cdr or cddr, of list without first or first  and	second
	    element.
       FTH fth_cons(FTH	value, FTH list)
       FTH fth_cons_2(FTH obj1,	FTH obj2, FTH list)
	    Returns  Lisp-like	cons pointer with value	as car and list	as cdr
	    or obj1 as car, obj2 as cadr and list as cddr.
       FTH fth_list_append(FTH args)
	    If args is not an Array or List object, returns nil, otherwise re-
	    turns new List object with each element of args concatenated  with
	    "fth_array_append".
       FTH fth_list_copy(FTH list)
	    Returns  copy of list with all elements new	created	in contrast to
	    "fth_list_to_array".
       ficlInteger fth_list_length(FTH obj)
	    Returns length if obj is a list (nil or  List  object),  otherwise
	    -1.
       FTH fth_list_member_p(FTH list, FTH key)
	    Returns #t if key exists in	list, otherwise	#f.
       FTH fth_list_ref(FTH list, ficlInteger index)
	    Returns  element at	position index of list.	 Negative index	counts
	    from backward.  Raises out-of-range	exception if index is  not  in
	    list's range.
       FTH fth_list_reverse(FTH	list)
	    Returns new	list with elements reversed.
       FTH fth_list_set(FTH list, ficlInteger index, FTH value)
	    Stores  element value at position index in list and	returns	value.
	    Negative index counts from backward.  Raises  out-of-range	excep-
	    tion if index is not in list's range.
       FTH fth_list_to_array(FTH list)
	    Returns copy of list as array only with references of each element
	    in	contrast to "fth_list_copy".  If lst is	not a List object, re-
	    turns #( lst ).
       FTH fth_make_empty_list(void)
	    Returns an empty List object with length 0.
       FTH fth_make_list_len(ficlInteger len)
	    Returns List object	with len entries.
       FTH fth_make_list_var(ficlInteger len, ...)
	    Returns List object	with  len  entries,  initialized  with	values
	    taken from function	argument list.
       FTH fth_make_list_with_init(ficlInteger len, FTH	init)
	    Returns List object	with len entries each initialized to init.

   AList Object	Type
       FTH fth_acons(FTH key, FTH value, FTH alist)
	    Returns  new  Lisp-like  associated	 list  from key-value pair and
	    alist.
       FTH fth_list_assoc(FTH alist, FTH key)
	    If key matches, returns corresponding  key-value  pair,  otherwise
	    #f.
       FTH fth_list_assoc_ref(FTH alist, FTH key)
	    If key matches, returns corresponding value, otherwise #f.
       FTH fth_list_assoc_remove(FTH alist, FTH	key)
	    If	key  matches, removes key-value	pair from alist.  Returns cur-
	    rent alist.
       FTH fth_list_assoc_set(FTH alist, FTH key, FTH value)
	    If key matches, sets key-value pair, otherwise adds	 new  pair  to
	    alist.  Returns current alist.

   General File	Functions
       General file functions:
       FTH fth_file_atime(const	char *name)
	    If name is a file, returns last access time.
       FTH fth_file_basename(const char	*name, const char *ext)
	    Returns  basename  of file name depending on ext.  If ext is NULL,
	    returns from last slash to last dot	in name, otherwise use ext  as
	    delimiter.
		  fth_file_basename("/home/mike/cage.snd", NULL);
		      => "cage"
		  fth_file_basename("/home/mike/cage.snd", ".snd");
		      => "cage"
		  fth_file_basename("/home/mike/cage.snd", "nd");
		      => "cage.s"
		  fth_file_basename("/home/mike/cage.snd", " ");
		      => "cage.snd"
       void fth_file_chmod(const char *name, mode_t mode)
	    Changes access mode	of file	name to	mode, see chmod(2).
       void fth_file_copy(const	char *src, const char *dst)
	    Copies  file  src  to  dst.	  If  dst  is a	directory, copy	src to
	    dst/src.  Raises system-error exception if fopen(3)	fails  on  any
	    of the two files.
       FTH fth_file_ctime(const	char *name)
	    If name is a file, returns status change time.
       void fth_file_delete(const char *name)
	    If	file  name  exists,  delete  it,  otherwise  do	 nothing,  see
	    unlink(2).
       FTH fth_file_dirname(const char *name)
	    Returns directory part of name.
       int fth_file_install(const char *src, const char	*dst, mode_t mode)
	    Installs src to dst	with access mode if dst	doesn't	 exist	or  if
	    modification time of src is	greater	than dst's. If dst is a	direc-
	    tory,  installs  src  to  dst/src.	 Returns 1 if src could	be in-
	    stalled, otherwise 0.
       FTH fth_file_length(const char *name)
	    If name is a file, returns length in bytes.
       FTH fth_file_match_dir(FTH string, FTH regexp)
	    Returns an array of	filenames in directory string matching regexp.
       void fth_file_mkdir(const char *name, mode_t mode)
	    Creates directory name with	access mode, see mkdir(2).
       void fth_file_mkfifo(const char *name, mode_t mode)
	    Creates fifo file name with	access mode, see mkfifo(2).
       FTH fth_file_mtime(const	char *name)
	    If name is a file, returns last modification time.
       FTH fth_file_realpath(const char	*name)
	    If name starts with	`~', replace it	with contents  of  environment
	    variable  HOME.   If realpath(3) function exists, returns resolved
	    path, otherwise returns name with `~' replacement.
       void fth_file_rename(const char *src, const char	*dst)
	    Renames src	to dst,	see rename(2).
       void fth_file_rmdir(const char *name)
	    Removes empty directory name, see rmdir(2).
       FTH fth_file_split(const	char *name)
	    Splits name	in dirname and basename	and returns the	result	in  an
	    array of two strings.
       void fth_file_symlink(const char	*src, const char *dst)
	    Creates symlink from src to	dst, see symlink(2).

   File	Test Functions
       int fth_file_block_p(const char *name)
	    Returns 1 if name is a block special file, see test(1) option -b.
       int fth_file_character_p(const char *name)
	    Returns  1 if name is a character special file, see	test(1)	option
	    -c.
       int fth_file_directory_p(const char *name)
	    Returns 1 if name is a directory, see test(1) option -d.
       int fth_file_executable_p(const char *name)
	    Returns 1 if name is an executable file, see test(1) option	-x.
       int fth_file_exists_p(const char	*name)
	    Returns 1 if name is an existing file, see test(1) option -e.
       int fth_file_fifo_p(const char *name)
	    Returns 1 if name is a named pipe, see test(1) option -p.
       int fth_file_grpowned_p(const char *name)
	    Returns 1 if name matches effective	group id, see  test(1)	option
	    -G.
       int fth_file_owned_p(const char *name)
	    Returns  1	if  name matches effective user	id, see	test(1)	option
	    -O.
       int fth_file_readable_p(const char *name)
	    Returns 1 if name is a readable file, see test(1) option -r.
       int fth_file_setgid_p(const char	*name)
	    Returns 1 if name has group	id flag	set, see test(1) option	-g.
       int fth_file_setuid_p(const char	*name)
	    Returns 1 if name has user id flag set, see	test(1)	option -u.
       int fth_file_socket_p(const char	*name)
	    Returns 1 if name is a socket, see test(1) option -S.
       int fth_file_sticky_p(const char	*name)
	    Returns 1 if name has sticky bit set, see test(1) option -k.
       int fth_file_symlink_p(const char *name)
	    Returns 1 if name is a symbolic link, see test(1) option -h.
       int fth_file_writable_p(const char *name)
	    Returns 1 if name is a writable file, see test(1) option -w.
       int fth_file_zero_p(const char *name)
	    Returns 1 if length	of file	name is	zero.

   Hash	Object Type
       A short Hash Object Type	example	in C:
	     FTH hs = fth_hash_set(FTH_FALSE,
		 fth_symbol("a"),
		 fth_make_array_var(3, FTH_ZERO, FTH_ONE, FTH_TWO));
	     fth_printf("%S\n",	hs);
	     fth_hash_set(hs, fth_symbol("b"), fth_make_string("text"));
	     fth_printf("%S\n",	hs);
	     fth_hash_ref(hs, fth_symbol("a"));	   => #( 0 1 2 )
	     fth_hash_ref(hs, fth_symbol("b"));	   => "text"
	     fth_hash_ref(hs, fth_symbol("c"));	   => #f
	     fth_hash_delete(hs, fth_symbol("a")); => '( 'a #( 0 1 2 ) )
	     fth_printf("%S\n",	hs);		   => #{ 'b => "text" }
	     fth_hash_clear(hs);
	     fth_printf("%S\n",	hs);		   => #{}

	     FTH hs_each(FTH key, FTH val, FTH data)
	     {
		 return	(fth_string_sformat(data, "%S: %S\n", key, val));
	     }

	     FTH hs_map(FTH key, FTH val, FTH data)
	     {
		 (void)key;
		 return	(fth_number_mul(val, data));
	     }

	     fth_hash_set(fth_symbol("a"), FTH_SIX);
	     fth_hash_each(hs, hs_each,	fth_make_empty_string());
						   => "'a: 6\n"
	     fth_hash_map(hs, hs_map, INT_TO_FIX(10));
						   => #{ 'a => 60 }

       C functions follow handling Hash	Object Types:

       int FTH_HASH_P(obj)
	    Returns 1 if obj is	a Hash object, otherwise 0.
       void fth_hash_clear(FTH hash)
	    Removes all	entries	from hash, hash's length becomes zero.
       FTH fth_hash_copy(FTH hash)
	    Returns copy of hash using object-copy for all elements.
       FTH fth_hash_delete(FTH hash, FTH key)
	    Deletes key-value pair associated with key and  returns  key-value
	    array, or #f if not	found.
       FTH  fth_hash_each(FTH  hash,  FTH (*func)(FTH key, FTH val, FTH	data),
	    FTH	data)
	    Runs func for each key-value pair.
		  /*
		   * #{	'a 0 'b	1 } value hs
		   * lambda: <{	key val	-- }>
		   *	 "%s=%s\n" #( key val )	fth-print
		   * ; hash-each
		   */
		  static FTH hs_each(FTH key, FTH val, FTH data)
		  {
		      fth_printf("%S=%S\n", key, val);
		      return (data);
		  }

		  fth_hash_each(hs, hs_each, FTH_NIL);
       int fth_hash_equal_p(FTH	obj1, FTH obj2)
	    Returns #t if obj1 and obj2	are Hash objects with same length  and
	    contents.
       FTH fth_hash_find(FTH hash, FTH key)
	    Returns key-value array if key exists, or #f if not	found.
       FTH fth_hash_keys(FTH hash)
	    Returns array of keys.
       ficlInteger fth_hash_length(FTH obj)
	    Returns length if obj is a Hash object, otherwise -1.
       FTH fth_hash_map(FTH hash, FTH (*func)(FTH key, FTH val,	FTH data), FTH
	    data)
	    Runs func for each key-value pair.	func's return value is the new
	    value for key.
		  /*
		   * #{	'a 0 'b	1 } value hs
		   * lambda: <{	key val	-- val }>
		   *	 val 10	+
		   * ; hash-map
		   */
		  static FTH hs_map(FTH	key, FTH val, FTH data)
		  {
		      (void)key;
		      return (fth_number_add(val, data);
		  }

		  fth_hash_map(hs, hs_map, INT_TO_FIX(10));
		      => #{ 'a => 10  'b => 11 }
       int fth_hash_member_p(FTH hash, FTH key)
	    Returns #t if key exists, otherwise	#f.
       FTH fth_hash_ref(FTH hash, FTH key)
	    Returns associated value, or #f if key was not found.
       FTH fth_hash_set(FTH hash, FTH key, FTH value)
	    If	hash  is  not  a  Hash	Object	type,  creates new hash.  Sets
	    key-value pair of hash.  If	key exists, overwrites existing	value,
	    otherwise creates new key-value entry.  Returns new	updated	hash.
       FTH fth_hash_to_array(FTH hash)
	    Returns array with #( key value ) pairs of hash's contents.
		  /* #{	'a 0  'b 1 } value hs */
		  FTH ary = fth_hash_to_array(hs); => #( #( 'a 0 ) #( 'b 1 ) )
       FTH fth_hash_values(FTH hash)
	    Returns array of values.
       FTH fth_make_hash(void)
	    Returns fresh empty	Hash object.
       FTH fth_make_hash_len(int hashsize)
	    Returns new	empty Hash object of hashsize buckets instead  of  the
	    default FTH_DEFAULT_HASH_SIZE.

   Properties
       There exists a global hash "properties" variable, which can be used for
       every  kind  of	information.   Furthermore,  every object created with
       "fth_make_instance" as well as every ficlWord has a property-slot,  for
       those see "object-properties" as	well as	"word-properties".

       Usage of	properties:
	     FTH pr = fth_properties(FTH_FALSE);  => #{}
	     fth_hash_length(pr);		  => 0

	     FTH obj = fth_make_string("string");
	     pr	= fth_properties(obj);		  => #f
	     fth_hash_length(pr);		  => 0
	     fth_property_set(obj,
		 fth_symbol("a"),
		 fth_make_string("hello"));
	     pr	= fth_properties(obj);		  => #{	'a "hello" }
	     fth_property_ref(obj, fth_symbol("a"));
						  => "hello"
	     fth_hash_length(pr);		  => 1
       FTH fth_properties(FTH obj)
	    Returns  obj's  property from the global properties	hash, or #f if
	    empty.  If obj is #f, returns entire global	properties hash.
       FTH fth_property_ref(FTH	obj, FTH key)
	    Returns obj's value	associated with	key from the global properties
	    hash variable, or #f.
       void fth_property_set(FTH obj, FTH key, FTH value)
	    Sets key-value pair	for obj	at the global  properties  hash	 vari-
	    able.  If key already exists, overwrites old value.

       Usage of	object-properties:
	     FTH obj = fth_make_string("string");
	     FTH pr = fth_object_properties(obj); => #f
	     fth_hash_length(pr);		  => 0
	     fth_object_property_set(obj,
		 fth_symbol("a"),
		 fth_make_string("hello"));
	     pr	= fth_object_properties(obj);	  => #{	'a "hello" }
	     fth_object_property_ref(obj, fth_symbol("a"));
						  => "hello"
	     fth_hash_length(pr);		  => 1
       FTH fth_object_properties(FTH obj)
	    Returns obj's properties, or #f if empty.
       FTH fth_object_property_ref(FTH obj, FTH	key)
	    Returns  obj's  property  value  associated	with key, or #f	if not
	    found.
       void fth_object_property_set(FTH	obj, FTH key, FTH value)
	    Sets key-value pair	to obj's property object.  If key already  ex-
	    ists, overwrites old value.

       Usage of	word-properties:
	     FTH obj = fth_proc_ref("noop");
	     FTH pr = fth_word_properties(obj);	  => #f
	     fth_hash_length(pr);		  => 0
	     fth_word_property_set(obj,
		 fth_symbol("a"),
		 fth_make_string("hello"));
	     pr	= fth_word_properties(obj);	  => #{	'a "hello" }
	     fth_word_property_ref(obj,	fth_symbol("a"));
						  => "hello"
	     fth_hash_length(pr);		  => 1
       FTH fth_word_properties(FTH obj)
	    Returns properties of obj, a ficlWord or Proc object, or #f.
       FTH fth_word_property_ref(FTH obj, FTH key)
	    Returns  value  associated with key	of property hash of obj, a fi-
	    clWord or Proc object, or #f.
       void fth_word_property_set(FTH obj, FTH key, FTH	value)
	    Sets key-value pair	property hash of obj, a	ficlWord or  Proc  ob-
	    ject.  If key already exists, overwrites old value.

   Hook	Object Type
       int FTH_HOOK_P(obj)
	    Returns 1 if obj is	a Hook object, otherwise 0.
       void fth_add_hook(FTH hook, FTH proc)
	    Add	 hook  procedure  proc to hook.	 Raises	bad-arity exception if
	    proc's arity doesn't match hook's arity.
       FTH fth_hook_apply(FTH hook, FTH	args, const char *caller)
	    Runs each of hook's	procedures with	args, a	single argument	or  an
	    array  of  arguments, and returns an array of results of all hook-
	    procedures.	 caller	is an arbitrary	string for some	exception  in-
	    formation.	 Raises	 bad-arity  exception if args's	length doesn't
	    match hook's arity.
       int fth_hook_arity(FTH hook)
	    Returns hook's required arguments.
       void fth_hook_clear(FTH hook)
	    Removes all	of hook's procedures.
       int fth_hook_empty_p(FTH	hook)
	    Returns 1 if hook has no hook procedures, otherwise	0.
       int fth_hook_equal_p(FTH	obj1, FTH obj2)
	    Returns 1 if obj1 and obj2 are Hook	objects	with  same  arity  and
	    procedures,	otherwise 0.
       int fth_hook_member_p(FTH hook, FTH name)
	    Returns  1 if hook has procedure name, otherwise 0.	 name can be a
	    string, an xt or a Proc object.
       FTH fth_hook_names(FTH hook)
	    Returns array of all of hook's procedure names (strings).
       FTH fth_hook_to_array(FTH hook)
	    Returns array of all of hook's procedures.
       FTH fth_make_hook(const char *name, int arity, const char *doc)
	    Returns new	Hook object name, arity	required arguments, 0 optional
	    arguments and no rest arguments, doc becomes the documentation  of
	    the	hook.
       FTH  fth_make_hook_with_arity(const  char  *name, int req, int opt, int
	    rest, const	char *doc)
	    Returns new	Hook object name, req required arguments, opt optional
	    arguments and rest rest arguments, doc becomes  the	 documentation
	    of the hook.
       FTH fth_make_simple_hook(int arity)
	    Returns  new Hook object with arity	required arguments, 0 optional
	    arguments and no rest arguments.
       FTH fth_remove_hook(FTH hook, FTH name)
	    Removes hook procedure name	from hook and returns it.  name	can be
	    a string, an xt or a Proc object.
       FTH fth_run_hook(FTH hook, int len, ...)
	    Runs each of hook's	procedures with	len arguments and  returns  an
	    array  of results of all hook-procedures.  Raises bad-arity	excep-
	    tion if len	doesn't	match hook's arity.
       FTH fth_run_hook_again(FTH hook,	int len, ...)
	    For	concatenating strings; the return value	of a proc_n is set  as
	    index  0  of  the  input  args-list	 for proc_n + 1.  Runs each of
	    hook's procedures with len arguments and returns the last  result.
	    Raises bad-arity exception if len doesn't match hook's arity.
       FTH fth_run_hook_bool(FTH hook, int len,	...)
	    Runs  each	of hook's procedures with len arguments	and returns #t
	    if hook is empty or	 any  of  the  procedures  didn't  return  #f.
	    Raises bad-arity exception if len doesn't match hook's arity.

   IO Functions
       There  are several IO functions for manipulating	file and pipe streams,
       strings and sockets.  Functions like "fth_io_read"  and	"fth_io_write"
       handle file, pipe, string, and socket IO	objects.
       int FTH_IO_P(obj)
	    Returns 1 if obj is	an IO object, otherwise	0.
       void fth_io_close(FTH io)
	    Flushes and	closes io object and sets closed? to 1.
       int fth_io_closed_p(FTH obj)
	    Returns 1 if io object is closed, otherwise	0.
       int fth_io_eof_p(FTH io)
	    Returns 1 if EOF is	reached, otherwise 0.
       int fth_io_equal_p(FTH obj1, FTH	obj2)
	    Returns  #t	 if obj1 and obj2 are IO objects with equal filenames,
	    modes and file positions.
       char* fth_io_filename(FTH io)
	    Returns filename of	io object or NULL if filename  is  not	avail-
	    able.  If io is a socket, it will return the hostname instead.
       int fth_io_fileno(FTH io)
	    Returns file descriptor of io.
       void fth_io_flush(FTH io)
	    Flushes io object.
       int fth_io_getc(FTH io)
	    Returns next character from	io object or EOF.
       int fth_io_input_p(FTH obj)
       int fth_io_output_p(FTH obj)
	    Returns 1 if obj is	an in- or output IO object, otherwise 0.
       ficl2Integer fth_io_length(FTH obj)
	    Returns length of OBJ.
       int fth_io_mode(FTH io)
	    Returns access mode	of io object.
       FTH  fth_io_nopen(const char *host, int port, int domain, int type, int
	    fam)
	    Opens a new	socket server or connects to  an  already  established
	    one	 and  returns  a corresponding IO object or, if	something went
	    wrong, #f.	host is	a host name (AF_INET/AF_INET6) or a path  name
	    (AF_UNIX).	  port	 is   the   connection	 port	if  domain  is
	    AF_INET/AF_INET6, otherwise	unused,	and domain  can	 be  AF_INET6,
	    AF_INET,  or  AF_UNIX,  type  can  be  SOCK_STREAM	or SOCK_DGRAM.
	    socket(2) is opened	with domain, type, and hard-coded flag 0.  fam
	    can	be FICL_FAM_CLIENT or FICL_FAM_SERVER.
		  /* port = 17:	Quote Of The Day (qotd of inetd(1)) */
		  int fam = FICL_FAM_CLIENT;
		  FTH io = fth_io_nopen("localhost", 17,
		      AF_INET6,	SOCK_STREAM, fam);

		  while	(!fth_io_eof_p(io))
		      fth_printf("%s", fth_io_read(io));

		  fth_io_close(io);

		  /*
		   * A server at port 2002 at one terminal (test_server):
		   *
		   * % ./test_server  => the server will print to *stdout*
		   *			 when a	client sends
		   */
		  int fam = FICL_FAM_SERVER;
		  FTH io = fth_io_nopen("localhost", 2002,
		      AF_INET6,	SOCK_STREAM, fam);

		  while	(!fth_io_eof_p(io))
		      fth_io_write(fth_io_stdout, fth_io_read(io));

		  fth_io_close(io);

		  /*
		   * A client at port 2002 at another terminal (test_client):
		   *
		   * % ls -lAF | ./test_client => sends	it to the server
		   */
		  int fam = FICL_FAM_CLIENT;
		  FTH io = fth_io_nopen("localhost", 2002,
		      AF_INET6,	SOCK_STREAM, fam);

		  while	(!fth_io_eof_p(fth_io_stdin))
		      fth_io_write(io, fth_io_read(fth_io_stdin));

		  fth_io_close(io);
       FTH fth_io_open(const char *name, int fam)
	    Opens  file	 name  with  mode  fam	which  can  be	FICL_FAM_READ,
	    FICL_FAM_WRITE and FICL_FAM_READ | FICL_FAM_WRITE.
		  FTH io = fth_io_open("foo", FICL_FAM_WRITE);
		  fth_io_write(io, "hello\n");
		  fth_io_write(io, "world\n");
		  fth_io_close(io);
		  FTH io = fth_io_open("foo", FICL_FAM_READ);
		  fth_printf("%s", fth_io_read(io); => "hello\n"
		  fth_printf("%s", fth_io_read(io); => "world\n"
		  fth_io_close(io);
		  /* or	*/
		  FTH io = fth_io_open("foo", FICL_FAM_READ | FICL_FAM_WRITE);
		  fth_io_write(io, "hello\n");
		  fth_io_write(io, "world\n");
		  fth_io_rewind(io);
		  fth_printf("%s", fth_io_read(io); => "hello\n"
		  fth_printf("%s", fth_io_read(io); => "world\n"
		  fth_io_close(io);
       int fth_io_output_p(FTH obj)
       FTH fth_io_popen(FTH cmd, int fam)
	    cmd	 is a string or	an array of strings, fam can be	FICL_FAM_READ,
	    FICL_FAM_WRITE and FICL_FAM_READ |	FICL_FAM_APPEND	 which	corre-
	    spond to popen(3) open modes "r", "w" and "r+".
		  /* read example (popen(3) mode == "r"): */
		  FTH fs = fth_make_string("ls");
		  FTH io = fth_io_popen(fs, FICL_FAM_READ);

		  while	(!fth_io_eof_p(io))
		      fth_printf("%s", fth_io_read(io));
		  fth_io_close(io);

		  /* write example (popen(3) mode == "w"): */
		  FTH fs = fth_make_string("cat");
		  FTH io = fth_io_popen(fs, FICL_FAM_WRITE);
		  fth_io_write(io, "hello\n");
		  fth_io_close(io);

		  /* read-write	example	(popen(3) mode == "r+"): */
		  FTH fs = fth_make_string("cat");
		  FTH io = fth_io_popen(fs, FICL_FAM_READ | FICL_FAM_APPEND);
		  fth_io_write(io, "hello\n");
		  fth_printf("%s", fth_io_read(io));
		  fth_io_close(io);
       ficl2Integer fth_io_pos_ref(FTH io)
	    Returns current io object position.
       void fth_io_pos_set(FTH io, ficl2Integer	pos)
	    Sets io object position to pos.
       void* fth_io_ptr(FTH io)
	    Returns  data  pointer of io object.  This is the FILE pointer for
	    file, pipe,	and socket objects and FTH string for String objects.
       void fth_io_putc(FTH io,	int c)
	    Writes character c to io object.
       char* fth_io_read(FTH io)
	    Returns next line from io object or	NULL if	EOF.
       FTH fth_io_read_line(FTH	io)
	    Returns next line as FTH string from io object or #f if EOF.   Re-
	    quired for "fth_object_apply".
       FTH fth_io_readlines(FTH	io)
	    Returns the	entire io object contents as an	array of strings, line
	    by line.
       void fth_io_rewind(FTH io)
	    Rewinds position to	begin of io object.
       FTH fth_io_sopen(FTH string, int	fam)
	    string  becomes  the  string IO object.  fam can be	FICL_FAM_READ,
	    FICL_FAM_WRITE and FICL_FAM_READ |	FICL_FAM_APPEND	 which	corre-
	    spond to open modes	"r", "w" and "r+".
		  /* read example (mode	== "r"): */
		  FTH fs = fth_make_string("string\n");
		  FTH io = fth_io_sopen(fs, FICL_FAM_READ);

		  while	(!fth_io_eof_p(io))
		      fth_printf("%s", fth_io_read(io));
		  fth_io_close(io);

		  /* write example (mode == "w"): */
		  FTH fs = fth_make_empty_string();
		  FTH io = fth_io_sopen(fs, FICL_FAM_WRITE);
		  fth_io_write(io, "hello\n");
		  fth_io_close(io);

		  /* read-write	example	(mode == "r+"):	*/
		  FTH fs = fth_make_empty_string();
		  FTH io = fth_io_sopen(fs, FICL_FAM_READ | FICL_FAM_APPEND);
		  fth_io_write(io, "hello\n");
		  fth_io_rewind(io);
		  fth_printf("%s", fth_io_read(io));
		  fth_io_close(io);
       FTH fth_io_to_string(FTH	io)
	    Returns contents of	io object as string if possible.
       void fth_io_write(FTH io, const char *line)
	    Writes line	to io object.
       void fth_io_write_and_flush(FTH io, const char *line)
	    Writes line	to io object and flush the IO object.
       void fth_io_write_format(FTH io,	FTH fmt, FTH args)
	    Writes formatted string to io object.
       void fth_io_writelines(FTH io, FTH array-of-lines)
	    Writes array-of-lines to io	object.
       FTH fth_readlines(const char *name)
	    Opens  file	 name, reads its contents in an	array, closes file and
	    returns the	array.
       void fth_writelines(const char *name, FTH array-of-lines)
	    Opens file name, writes the	contents of array-of-lines to  it  and
	    closes file.
       int fth_get_exit_status(void)
	    Returns  exit status of last extern	process	from "fth_file_shell",
	    "fth_file_system", etc.
       int fth_set_exit_status(int status)
	    Sets global	variable fth_exit_status.
       FTH fth_set_io_stdin(FTH	io)
       FTH fth_set_io_stdout(FTH io)
       FTH fth_set_io_stderr(FTH io)
	    They set io	as the current input, output, and error	IO object  and
	    return the old one.
       FTH fth_gethostbyaddr(FTH ip)
	    Returns  a	hash  with slots 'name (string), 'aliases (array), and
	    'addr-list (array) filled with results from	gethostbyaddr(3) look-
	    ing	for ip (a string).
       FTH fth_gethostbyname(FTH host)
	    Returns a hash with	slots 'name (string),  'aliases	 (array),  and
	    'addr-list	(array)	 filled	 with  results	from gethostbyname2(3)
	    looking for	host (a	string).
       FTH fth_getservbyname(FTH serv)
	    Returns a hash with	slots 'name (string), 'aliases (array),	 'port
	    (integer),	 and  'protocol	 (string)  filled  with	 results  from
	    getservbyname(3) looking for service serv (a string).
       FTH fth_getservbyport(FTH port)
	    Returns a hash with	slots 'name (string), 'aliases (array),	 'port
	    (integer),	 and  'protocol	 (string)  filled  with	 results  from
	    getservbyport(3) looking for port (a number).
       FILE* fth_tmpfile(void)
       FTH fth_io_tmpfile(void)
	    Creates a temporary	file resp. file	IO object  that	 is  automati-
	    cally  removed  when  it is	closed or on program termination.  See
	    tmpfile(3) and mkstemp(3).

   Miscellaneous
       Initialization Functions
       void fth_init(void)
	    This function must be called before	any libfth.so action can  take
	    place.
       void fth_exit(int n)
	    Calls  "fth_exit_hook"  and	 exit(3)  with return code n.  exit(3)
	    calls atexit(3) with the fth_at_exit_procs list.
       void fth_reset(void)
	    Resets Ficl	System and Ficl	Vm and restarts	Fth.

       Evaluation Functions
       int fth_catch_eval(const	char *buffer)
       int fth_catch_exec(ficlWord *word)
	    Execute C string buffer or ficlWord	word and return	status only as
	    FTH_OKAY, FTH_BYE (exit), or FTH_ERROR.
       FTH fth_eval(const char *buffer)
	    Evaluates C	string buffer.	If buffer is NULL or evaluates	to  no
	    value,  returns  undef, if buffer evaluates	to FTH_BYE, exits pro-
	    gram, if buffer evaluates to a single value, removes it from stack
	    and	returns	it, if buffer evaluates	to more	than one  values,  re-
	    moves them from stack and returns them as Array object.

       Loading Source Files
       void fth_add_load_lib_path(const	char *path)
       void fth_unshift_load_lib_path(const char *path)
	    Add	 path  at  the	front  or  back	 of  the global	array variable
	    *load-lib-path* if not already there.
       void fth_add_load_path(const char *path)
       void fth_unshift_load_path(const	char *path)
	    Add	path at	the  front  or	back  of  the  global  array  variable
	    *load-path*	if not already there.
       void fth_add_loaded_files(const char *file)
	    Pushs  file	at the end of the global array variable	*loaded-files*
	    if not already there.
       char* fth_basename(const	char *path)
	    Returns the	part of	path after the last `/'.
       FTH fth_find_file(FTH name)
	    Returns full path of name or #f.
       void fth_install_file(FTH fname)
	    Installs fname in the first	writable path found in *load-path*  or
	    *load-lib-path*.  Warns if no writable path	could be found.
       FTH fth_dl_load(const char *lib,	const char *func)
       FTH fth_load_file(const char *name)
       FTH fth_require_file(const char *name)
	    They  load	C  string name as Fth source or	as dynamic library and
	    add	name to	the  global  array  *loaded-files*.   Before  loading,
	    "before-load-hook" is called.  If this hook	returns	#f, nothing is
	    loaded  and	 the return value is #f.  If loading finishes success-
	    fully, the return value is #t, otherwise an	exception  is  thrown.
	    After  loading,  "after-load-hook" is called.  If name has no file
	    extension, FTH_FILE_EXTENSION `.fs'	or `.so' will  be  added.   If
	    name or name plus extension	doesn't	exist, try all path names from
	    either  *load-path*	 or *load-lib-path* with name.	If name	begins
	    with `~', replace it with HOME.  fth_load_file can load  the  same
	    file  more	than once, while fth_require_file and fth_dl_load load
	    files only once.  fth_dl_load calls	func to	 initializes  the  dy-
	    namic library.
       FTH fth_load_init_file(const char *init_file)
       FTH fth_load_global_init_file(void)
	    Load     C	   string     init_file	    or	  FTH_GLOBAL_INIT_FILE
	    ${prefix}/etc/fthrc	as Forth source	file if	it  exists,  otherwise
	    do	nothing.   If init_file	is NULL, try to	load FTH_INIT_FILE, if
	    FTH_INIT_FILE  is  not  set,  try  to  load	 HOME/.fthrc  instead.
	    "before-load-hook" and "after-load-hook" are called.

       Various Functions
       void fth_add_feature(const char *name)
       int fth_provided_p(const	char *name)
	    Pushs  C  string  name  to	the *features* list and	fth_provided_p
	    tests if feature name exists in the	list.
       FTH fth_apropos(FTH regexp)
       FTH fth_find_in_wordlist(const char *name)
	    Return array with found words from the current word	list  matching
	    regexp or name.
       FTH fth_gethostname(void)
       int fth_sethostname(FTH fs)
	    Get	and set	hostname, see gethostname(3) and sethostname(3).
       FTH fth_getrusage(void)
	    Returns  an	 array of 16 elements with all slots of	struct rusage.
	    See	getrusage(2) for more information.
       char* fth_parse_word(void)
	    The	calling	word is	a parse	word and receives its input  from  the
	    next  entry	 in the	input stream.  If the contents of vm->pad is a
	    word, return word's	name, otherwise	return the string itself.
		  FTH parse_test(void)
		  {
		      return (fth_make_string(fth_parse_word()));
		  }

		  fth_make_proc_from_func("parse-test",	parse_test, 0, 0, 0, 0);
		  fth_eval("parse-test make-array"); =>	"make-array"
       FTH fth_uname(void)
	    Returns Hash  object  with	five  slots  containing	 entries  from
	    uname(3), which are:
		  'sysname
		  'nodename
		  'release
		  'version
		  'machine
       char* fth_version(void)
       char* fth_short_version(void)
	    Return short or long version strings.
       FTH fth_wordlist_each(int (*func)(ficlWord *word, FTH data), FTH	data)
	    Loops  through  entire  current word list and collects words in an
	    array where	func returns not 0.

   General Numbers
       int FTH_EXACT_P(obj)
       int fth_exact_p(obj)
	    Return 1 if	obj is an exact	number,	otherwise 0.
       int FTH_FIXNUM_P(obj)
       int fth_fixnum_p(obj)
	    Return 1 if	obj is a fixnum, otherwise 0.
       int FTH_NUMBER_P(obj)
       int fth_number_p(obj)
       int FTH_FLOAT_P(obj)
	    Return 1 if	obj is any kind	of a number, otherwise 0.
       int FTH_INTEGER_P(obj)
       int FTH_LONG_LONG_P(obj)
       int fth_integer_p(obj)
       int FTH_UNSIGNED_P(obj)
       int fth_unsigned_p(obj)
	    Return 1 if	obj is integer,	otherwise 0.
       int fth_isinf(ficlFloat f)
       int fth_isnan(ficlFloat f)
	    Return 1 if	f is infinite or not-a-number, otherwise 0.
       int FTH_LLONG_P(obj)
       int FTH_ULLONG_P(obj)
       int fth_ullong_p(obj)
	    Return 1 if	obj is a Llong object, otherwise 0.
       FTH fth_make_float(ficlFloat f)
       FTH fth_float_copy(FTH x)
	    Return a Float object.
       FTH fth_make_llong(ficl2Integer d)
       FTH fth_make_ullong(ficl2Unsigned ud)
       FTH fth_llong_copy(FTH obj)
	    Return a Llong object.
       FTH fth_make_int(ficlInteger n)
       FTH fth_make_unsigned(ficlUnsigned u)
       FTH fth_make_long_long(ficl2Integer d)
       FTH fth_make_ulong_long(ficl2Unsigned ud)
	    Return a Fixnum or a Llong object depending	on input.
       ficlFloat fth_float_ref(FTH x)
       ficlFloat fth_real_ref(FTH x)
       ficlInteger fth_int_ref(FTH x)
       ficlUnsigned fth_unsigned_ref(FTH x)
       ficl2Integer fth_long_long_ref(FTH x)
       ficl2Unsigned fth_ulong_long_ref(FTH x)
	    They convert any number x to the corresponding return type.
       ficlFloat fth_float_ref_or_else(FTH x, ficlFloat	fallback)
       ficlInteger fth_int_ref_or_else(FTH x, ficlInteger fallback)
	    They convert any number x to the corresponding return type.	 If  x
	    doesn't fit	in Fixnum or Number object, fallback will be returned.

   Complex Numbers
       int FTH_COMPLEX_P(obj)
	    Returns 1 if obj is	a Complex object, otherwise 0.
       FTH fth_make_complex(ficlComplex	z)
       FTH fth_make_polar(ficlFloat real, ficlFloat theta)
       FTH fth_make_rectangular(ficlFloat real,	ficlFloat image)
	    Return a Complex object.
       ficlComplex fth_complex_ref(FTH x)
	    They convert any number x to ficlComplex.
       ficlComplex ficlStackPopComplex(ficlStack *stack)
       void ficlStackPushComplex(ficlStack *stack, ficlComplex cp)
	    The	 Complex  number stack functions to push to and	pop from stack
	    Complex objects.

   Bignum Objects
       int FTH_BIGNUM_P(obj)
	    Returns 1 if obj is	a Bignum object, otherwise 0.
       FTH fth_make_bignum(ficlBignum bn)
       FTH fth_bignum_copy(FTH m)
	    Return a Bignum object.
       ficlBignum fth_bignum_ref(FTH obj)
	    They convert any number x to ficlBignum.
       ficlBignum ficlStackPopBignum(ficlStack *stack)
       void ficlStackPushBignum(ficlStack *stack, ficlBignum bn)
	    The	Bignum number stack functions to push to and  pop  from	 stack
	    Bignum objects.

   Ratio Objects
       int FTH_RATIO_P(obj)
	    Returns 1 if obj is	a Ratio	object,	otherwise 0.
       FTH fth_make_ratio(FTH num, FTH den)
	    Returns a Ratio object from	num and	den.
       FTH fth_make_ratio_from_float(ficlFloat f)
       FTH fth_make_ratio_from_int(ficlInteger num, ficlInteger	den)
       FTH fth_make_rational(ficlRatio r)
	    Return a Ratio object from the corresponding input.
       ficlRatio fth_ratio_ref(FTH obj)
	    They convert any number x to ficlRatio.
       FTH fth_denominator(FTH x)
       FTH fth_numerator(FTH x)
	    Return denominator or numerator of x.
       FTH fth_ratio_floor(FTH x)
	    Returns the	floor of x.
       FTH fth_rationalize(FTH x, FTH err)
	    Returns inexact number within err of x.
       ficlRatio ficlStackPopRatio(ficlStack *stack)
       void ficlStackPushRatio(ficlStack *stack, ficlRatio r)
	    The	Ratio number stack functions to	push to	and pop	from stack Ra-
	    tio	objects.

   Random Numbers
       ficlFloat fth_frandom(ficlFloat f)
	    Returns ficlFloats in the range of -f ...  f.
       ficlFloat fth_random(ficlFloat f)
	    Returns ficlFloats in the range of 0 ...  f.
       void fth_srand(ficlInteger n)
	    Sets variable fth_rand_rnd to seed n.

   General Number Functions
       FTH fth_exact_to_inexact(FTH x)
       FTH fth_inexact_to_exact(FTH x)
	    Convert x from and to exact	and inexact numbers.
       int fth_number_equal_p(FTH x, FTH y)
       int fth_number_less_p(FTH x, FTH	y)
	    Return 1 if	x is equal (or less than) y, otherwise 0.
       FTH fth_number_add(FTH x, FTH y)
       FTH fth_number_div(FTH x, FTH y)
       FTH fth_number_mul(FTH x, FTH y)
       FTH fth_number_sub(FTH x, FTH y)
	    Return result of x add/div/mul/sub y.

   Garbage Collection
       int fth_gc_marked_p(FTH obj)
       int fth_gc_protected_p(FTH obj)
       int fth_gc_permanent_p(FTH obj)
	    Return  #t	if obj is an instance and the mark/protected/permanent
	    flag is set.  New created objects have the mark flag set.
       void fth_gc_mark(FTH obj)
       void fth_gc_unmark(FTH obj)
       FTH fth_gc_protect(FTH obj)
       FTH fth_gc_unprotect(FTH	obj)
       FTH fth_gc_permanent(FTH	obj)
	    They mark or unmark	obj to protect or unprotect  it	 from  garbage
	    collection.
       FTH fth_gc_on(void)
       FTH fth_gc_off(void)
       void fth_gc_run(void)
	    They turn garbage collection on or off and run garbage collection.

   Object-Type And Instance Functions
       void* fth_instance_ref_gen(FTH obj)
       FTH fth_instance_ref_obj(FTH obj)
	    fth_instance_ref_gen    returns    the    GEN-struct    of	  obj,
	    fth_instance_ref_obj   returns   the   OBJ-struct	of   obj   for
	    "fth_make_object_type_from".
       int fth_instance_p(FTH obj)
       int fth_object_is_instance_of(FTH obj, FTH type)
	    Return #t if obj is	an instance resp. an instance of type.
       FTH fth_make_instance(FTH obj, void *gen)
	    Returns  new  instance  of object-type obj with gen	struct wrapped
	    in.
       int fth_instance_flag_p(FTH obj,	int flag)
       int fth_instance_type_p(FTH obj,	fobj_t type)
	    Check if obj has flag set or is of type.  Flags are	used  for  ex-
	    act, inexact and numbers in	general	and types for internal object-
	    types like Array, Hash, etc.
       FTH fth_make_object_type(const char *name)
       int fth_object_type_p(FTH obj)
	    fth_make_object_type  creates a new	object-type name and adds name
	    to the feature list, creates a constant  fth-name  of  object-type
	    and	returns	the new	object-type name.  The new created object-type
	    can	 be used to bind words to it.  fth_object_type_p checks	if obj
	    is an object-type.
       FTH fth_make_object_type_from(const char	*name, FTH base)
	    Creates a new object-type name derived from	base and adds name  to
	    the	 feature  list,	creates	a constant fth-name of object-type and
	    returns the	new object-type	name.  All object functions defined by
	    base are available and probably only a few have to be  changed  or
	    added.
       char* fth_object_name(FTH obj)
	    Returns object-type	name of	obj as a string.

   Object Set Functions
       FTH  fth_set_object_apply(FTH  obj,  void  *fnc,	 int req, int opt, int
	    rest)
       FTH fth_set_object_copy(FTH obj,	FTH (*fnc)(FTH obj))
       FTH fth_set_object_dump(FTH obj,	FTH (*fnc)(FTH obj))
       FTH fth_set_object_equal_p(FTH obj, FTH (*fnc)(FTH obj1,	FTH obj2))
       FTH fth_set_object_free(FTH obj,	void (*fnc)(FTH	obj))
       FTH fth_set_object_inspect(FTH obj, FTH (*fnc)(FTH obj))
       FTH fth_set_object_length(FTH obj, FTH (*fnc)(FTH obj))
       FTH fth_set_object_mark(FTH obj,	void (*fnc)(FTH	obj))
       FTH fth_set_object_to_array(FTH obj, FTH	(*fnd)(FTH obj))
       FTH fth_set_object_to_string(FTH	obj, FTH (*fnc)(FTH obj))
       FTH fth_set_object_value_ref(FTH	obj, FTH (*fnc)(FTH obj, FTH index))
       FTH fth_set_object_value_set(FTH	obj, FTH (*fnc)(FTH  obj,  FTH	index,
	    FTH	value))
	    They set fnc as object- xxx	function to object-type	obj.

   General Object Functions
       ficlInteger fth_cycle_next(FTH obj)
       ficlInteger fth_cycle_pos_0(FTH obj)
       ficlInteger fth_cycle_pos_ref(FTH obj)
       ficlInteger fth_cycle_pos_set(FTH obj, ficlInteger index)
       FTH fth_object_cycle_ref(FTH obj)
       FTH fth_object_cycle_set(FTH obj, FTH value)
	    Return  or set values at current cycle-index, return or set	cycle-
	    index or set cycle-index to	zero.  Cycles through contents of  obj
	    from first to last entry and starts	over at	the beginning etc.
       FTH fth_hash_id(FTH obj)
	    Returns  hash  id computed from string representation of obj.  Ob-
	    jects with the same	contents have the same id.
       FTH fth_object_apply(FTH	obj, FTH args)
	    Runs apply on obj with args	as arguments.  args can	be an array of
	    arguments or a single argument.  The number	of args	must  fit  ap-
	    ply's definition.  The next	two examples require each 1 argument:
		  fth_set_object_apply(vct_tag,	vct_ref, 1, 0, 0); /* C	*/
		  <'> enved-ref	fth-enved 1 set-object-apply \ Forth
       FTH fth_object_copy(FTH obj)
	    Returns copy of obj.  Copies any element if	obj is an instance.
       FTH fth_object_dump(FTH obj)
       char* fth_to_c_dump(FTH obj)
	    Return dump	string of obj which may	be evaled to reinstate the ob-
	    ject from a	file.
       int fth_object_empty_p(FTH obj)
	    Returns 1 if length	of obj is zero,	otherwise 0.
       int fth_object_equal_p(FTH obj1,	FTH obj2)
	    Returns 1 if obj1 and obj2 have equal contents, otherwise 0.
       FTH fth_object_id(FTH obj)
	    Returns object id of obj, a	uniq number.
       FTH fth_object_find(FTH obj, FTH	key)
       ficlInteger fth_object_index(FTH	obj, FTH key)
       int fth_object_member_p(FTH obj,	FTH key)
	    Return  the	 index,	the element or 1 (member) if key is present in
	    obj, otherwise -1 (index), #f (find) or 0 (member).
       FTH fth_object_inspect(FTH obj)
       char* fth_to_c_inspect(FTH obj)
	    Return inspect string of obj.
       ficlInteger fth_object_length(FTH obj)
	    Returns length of obj.
       int fth_object_range_p(FTH obj, ficlInteger index)
	    Returns 1 if index is in range of obj, otherwise 0.
       FTH fth_object_sort(FTH obj, FTH	proc)
	    Converts obj to an array, sorts and	returns	it.  proc compares two
	    items A and	B and should return a negative integer if A < B, 0  if
	    A == B, and	a positive integer if A	> B.
       FTH fth_object_to_array(FTH obj)
	    Returns obj	as array.
       FTH fth_object_to_string(FTH obj)
       char* fth_to_c_string(FTH obj)
	    Return string representation of obj.
       FTH fth_object_value_ref(FTH obj, ficlInteger index)
       FTH fth_object_value_set(FTH obj, ficlInteger index, FTH	value)
	    Return  or set value at index.  If obj is of a type	which can have
	    multiple elements, an array	for example, returns value  at	index.
	    If	obj  is	of a type which	consists of only one element, a	fixnum
	    for	example, ignores index and returns obj	itself	and  set  does
	    nothing.

   Stack Access
       FTH ficl_to_fth(FTH obj)
       FTH fth_to_ficl(FTH obj)
	    Convert  ficlInteger  to Fixnum or Fixnum to ficlInteger, the rest
	    stays.
       FTH fth_pop_ficl_cell(ficlVm *vm)
       void fth_push_ficl_cell(ficlVm *vm, FTH obj)
	    Pop	from or	push to	Top Of Stack TOS with ficlInteger converted to
	    Fixnum (pop) or Fixnum converted to	ficlInteger (push),  the  rest
	    stays.

   Port	IO Object Type
       void fth_port_close(FTH port)
       void fth_port_flush(FTH port)
	    Flush or close port.  If port is #f, do nothing.
       void fth_port_display(FTH port, FTH obj)
	    Writes  string  representation  of	obj  to	 port.	If port	is #f,
	    prints to Ficl output.
       int fth_port_getc(FTH port)
       char* fth_port_gets(FTH port)
	    Return next	character or next line from port IO object.   If  port
	    is #f, read	from Ficl input.
       void fth_port_putc(FTH port, int	c)
       void fth_port_puts(FTH port, const char *str)
	    Write  character  or string	to port.  If port is #f, write to Ficl
	    output.
       in_cb fth_set_read_cb(in_cb cb)
       out_cb fth_set_print_cb(out_cb cb)
       out_cb fth_set_error_cb(out_cb cb)
       out_cb fth_set_print_and_error_cb(out_cb	cb)
	    Set	the read, print, and error callback functions.	If cb is NULL,
	    use	default_read_cb, default_print_cb, and default_error_cb.
       FTH fth_port_to_string(FTH port)
	    Returns entire contents of port IO	object	as  String  object  if
	    available.	If port	is #f, returns #f.

   Printf
       The  format string for the following functions can have zero or more of
       the following flags:
	     `#'       The value will be converted to an alternate form.   For
		       b,  B, o	and O conversion prepend a zero	before output,
		       for x and X conversion prepend a	`0x'  respective  `0X'
		       before  output.	 For a,	A, e, E, f, F, g and G conver-
		       sion the	result will always have	a decimal point.
	     `-'       Flushes output left.
	     `0' (zero)
		       Padding with `0'	(zero) rather than blank.
	     `l'       Modifier	for long, unsigned long	and long *.
	     `ll'      Modifier	for long long, unsigned	 long  long  and  long
		       long *.
	     `z'       Modifier	for size_t.
       The following conversion	specifiers are known:
	     %	       A `%' is	written.
	     aAeEfFgG  Floating	point output like printf(3).
	     bBdoOpuUxX
		       Integer output in binary, decimal, octal, void pointer,
		       unsigned	and hexadecimal	form.
	     c	       Single character	output.
	     D	       Dump   string   output	of   any   Forth  object  with
		       object-dump.
	     I	       Inspect	string	output	of  any	 Forth	 object	  with
		       object-inspect.
	     M	       String	representation	 of   any  Forth  object  with
		       object->string, in addition, strings will  be  enclosed
		       in double quotations ("string").
	     qQs       C string	char * output.
	     S	       String	representation	 of   any  Forth  object  with
		       object->string.
       int fth_debug(const char	*fmt, ...)
	    Writes  the	 formatted  string  to	 FILE	*stderr	  wrapped   in
	    #<DEBUG(C):	...> and returns the written bytes.
       void fth_die(const char *fmt, ...)
       int fth_warning(const char *fmt,	...)
	    Print  formatted  string  to  Ficl	error output wrapped either in
	    #<warning: ...> continuing execution, or in	#<die: ...>  and  exit
	    the	 interpreter with return code 1	(EXIT_FAILURE).	 "fth_warning"
	    returns the	written	bytes.
       int fth_error(const char	*str)
       int fth_errorf(const char *fmt, ...)
       int fth_verrorf(const char *fmt,	va_list	ap)
	    Write formatted string to Ficl  error  output.   They  return  the
	    written bytes.
       char* fth_format(const char *fmt, ...)
       char* fth_vformat(const char *fmt, va_list ap)
	    Return  new	 allocated buffer containing the formatted string.  If
	    the	string is no longer needed, it should be freed.
       int fth_fprintf(FILE *fp, const char *fmt, ...)
       int fth_ioprintf(FTH io,	const char *fmt, ...)
       int fth_port_printf(FTH port, const char	*fmt, ...)
       int fth_vfprintf(FILE *fp, const	char *fmt, va_list ap)
       int fth_vioprintf(FTH io, const char *fmt, va_list ap)
       int fth_port_vprintf(FTH	port, const char *fmt, va_list ap)
	    Write formatted string to the FILE pointer fp, the IO  object  io,
	    or	the  Port  object  port.  If port is #f, write to Ficl output.
	    They return	the written bytes.
       char* fth_read(void)
       int fth_print(const char	*str)
       int fth_printf(const char *fmt, ...)
       int fth_vprintf(const char *fmt,	va_list	ap)
	    Read from Ficl input or write to Ficl output.  The write-functions
	    return the written bytes.
       int fth_asprintf(char **result, const char *fmt,	...)
       int fth_vasprintf(char **result,	const char *fmt, va_list ap)
	    The	result points to a newly allocated buffer containing the  for-
	    matted string.  Return the length of the allocated string.	If the
	    string is no longer	needed,	it should be freed.
       int fth_snprintf(char *buffer, size_t size, const char *fmt, ...)
       int  fth_vsnprintf(char	*buffer, size_t	size, const char *fmt, va_list
	    ap)
	    Create formatted string and	write at most size -  1	 character  to
	    buffer.

   Procs
       int fth_word_defined_p(FTH obj)
	    Test  if obj is an already defined word, a variable	or constant or
	    any	other object in	the dictionary.
		  FTH x	= (FTH)FICL_WORD_NAME_REF("bye");
		  fth_word_defined_p(x); => 1
		  fth_variable_set("hello", FTH_FALSE);
		  FTH x	= (FTH)FICL_WORD_NAME_REF("hello");
		  fth_word_defined_p(x); => 1
		  fth_word_defined_p(FTH_FALSE); => 0
       int fth_word_type_p(FTH obj, int	type)
	    Test if obj	is of type where type can be one of the	following:

	    FW_WORD
	    FW_PROC
	    FW_SYMBOL
	    FW_KEYWORD
	    FW_EXCEPTION
	    FW_VARIABLE
	    FW_TRACE_VAR

		  FTH x	= (FTH)FICL_WORD_NAME_REF("bye");
		  fth_word_type_p(x, FW_WORD); => 1
		  fth_word_type_p(x, FW_KEYWORD); => 0
       int FTH_PROC_P(obj)
	    Returns 1 if obj is	a Proc object, otherwise 0.
       int FTH_WORD_P(obj)
	    Returns 1 if obj is	a ficlWord, otherwise 0.
       ficlWord* fth_define_procedure(const char *name,	void *func,  int  req,
	    int	opt, int rest, const char *doc)
	    Returns  new  ficlWord  name  tied to C function func with req re-
	    quired arguments, opt optional arguments and rest (1) or  no  rest
	    (0)	 arguments with	optional documentation string doc.  func takes
	    zero or more FTH objects and returns a FTH object.
       ficlWord* fth_define_void_procedure(const char *name, void  *func,  int
	    req, int opt, int rest, const char *doc)
	    Returns  new  ficlWord  name  tied to C function func with req re-
	    quired arguments, opt optional arguments and rest (1) or  no  rest
	    (0)	 arguments with	optional documentation string doc.  func takes
	    zero or more FTH objects and doesn't return	any (void).
       FTH fth_documentation_ref(FTH obj)
	    Returns documentation property string of obj or #f.
       void fth_documentation_set(FTH obj, FTH doc)
	    Sets documentation property	string of any obj to doc.
       FTH fth_get_optarg(ficlInteger req, FTH def)
	    Returns either default value def or	a value	found on top of	stack.
	    req	is the sum of required and following optional arguments.
       FTH fth_get_optkey(FTH key, FTH def)
       int fth_get_optkey_fix(FTH key, int def)
       ficlInteger fth_get_optkey_int(FTH key, ficlInteger def)
       ficl2Integer fth_get_optkey_2int(FTH key, ficl2Integer def)
       char* fth_get_optkey_str(FTH key, char *def)
	    Return either default value	def or a value found on	 stack	speci-
	    fied by keyword key.
       FTH fth_make_proc(ficlWord *word, int req, int opt, int rest)
	    If	word is	an existing ficlWord, returns a	corresponding Proc ob-
	    ject with req reqired, opt optional	and rest  function  arguments.
	    If word is not an existing word, returns #f.
		  ficlWord *xt = FICL_WORD_NAME_REF("+");
		  FTH prc = fth_make_proc(xt, 2, 0, 0);
		  fth_proc_call(prc, __func__, 2, FTH_ONE, FTH_TWO); =>	3
       FTH  fth_make_proc_from_func(const  char	*name, void *func, int void_p,
	    int	req, int opt, int rest)
	    Returns a Proc object from C-function func where name is the  name
	    on	the Forth interpreter side, void_p if func is a	void function,
	    req	required, opt optional and rest	function arguments.
       FTH fth_proc_apply(FTH proc, FTH	args, const char *caller)
	    If proc is a Proc object, executes its ficlWord with Array	object
	    args  as  arguments	on stack.  caller can be any C string used for
	    error message.  Raises bad-arity exception if proc	has  more  re-
	    quired  arguments than len.	 Raises	eval-error exception if	an er-
	    ror	occurred during	evaluation.

	    If proc is not a Proc object, returns #f, If proc doesn't leave  a
	    return  value  on stack, returns #f, if proc leaves	a single value
	    on stack, returns it, if proc  leaves  more	 than  one  values  on
	    stack, returns them	as Array object.
       int fth_proc_arity(FTH proc)
	    If	proc  is  a  Proc object, returns required arguments as	C int,
	    otherwise returns 0.
       FTH fth_proc_call(FTH proc, const char *caller, int len,	...)
	    If proc is a Proc object, executes its ficlWord with len arguments
	    on stack.  caller can be any C  string  used  for  error  message.
	    Raises  bad-arity  exception  if  proc has more required arguments
	    than len.  Raises eval-error exception if an error occurred	during
	    evaluation.

	    If proc is not a Proc object, returns #f, If proc doesn't leave  a
	    return  value  on stack, returns #f, if proc leaves	a single value
	    on stack, returns it, if proc  leaves  more	 than  one  values  on
	    stack, returns them	as Array object.
       char* fth_proc_name(FTH obj)
	    If	obj is a ficlWord, returns name	as C string, otherwise returns
	    "not-a-proc".
       FTH fth_proc_source_ref(FTH proc)
	    Returns source string property of proc, or #f if not available.
       void fth_proc_source_set(FTH proc, FTH source)
	    Sets source	string property	of proc	to source.
       ficlWord* fth_proc_to_xt(FTH proc)
	    Returns the	actual word (the execution token xt) of	proc.
       FTH fth_source_file(FTH obj)
	    Returns source file	where obj was created, or #f if	a  C-primitive
	    or not defined.
       FTH fth_source_line(FTH obj)
	    Returns  source  line  number  where obj was created or #f if a C-
	    primitive or not defined.
       FTH fth_source_ref(FTH obj)
	    Returns source string of obj, a proc or xt,	or #f if not found.
       void fth_source_set(FTH obj, FTH	source)
	    Sets source	string of obj, a proc or xt, to	source.
       ficlWord* fth_word_doc_set(ficlWord *word, const	char *str)
	    Sets word's	documentation property to str.
       FTH fth_xt_apply(const char *name, FTH args, const char *caller)
	    Executes name, a C string, with array  length  arguments  of  type
	    FTH.   caller  can be any C	string used for	error message.	Raises
	    eval-error exception if an error occurred during evaluation.

	    If the xt with name	doesn't	leave a	return value on	stack, returns
	    #f,	if a single value remains on stack, returns it,	if  more  than
	    one	values remain on stack,	returns	them as	Array object.
		  FTH fs = fth_make_string("hello, world!");
		  FTH re = fth_make_regexp(", (.*)!");
		  FTH ary = fth_make_array_var(2, re, fs);
		  fth_xt_apply("regexp-match", ary, __func__); => 8
		  fth_xt_apply("*re1*",	FTH_FALSE, __func__) =>	"world"
       FTH fth_xt_call(const char *name, FTH args, const char *caller)
	    Executes name, a C string, with len	arguments of type FTH.	caller
	    can	be any C string	used for error message.	 Raises	eval-error ex-
	    ception if an error	occurred during	evaluation.

	    If the xt with name	doesn't	leave a	return value on	stack, returns
	    #f,	 if  a single value remains on stack, returns it, if more than
	    one	values remain on stack,	returns	them as	Array object.
		  FTH fs = fth_make_string("hello, world!");
		  FTH re = fth_make_regexp(", (.*)!");
		  fth_xt_call("regexp-match", __func__,	2, re, fs); => 8
		  fth_xt_call("*re1*", __func__, 0); =>	"world"
       ficlWord* fth_word_ref(const char *name)
	    Finds name in Forth	dictionary and returns ficlWord.
       FTH fth_proc_ref(const char *name)
	    Finds name in Forth	dictionary and returns ficlWord	casted to FTH.
       ficlWord* fth_variable_obj(const	char *name)
	    Finds name in Forth	dictionary and returns ficlWord	casted to  FTH
	    if it's a variable,	otherwise #f.

   Define Variables
       FTH fth_define(const char *name,	FTH value)
	    Defines  constant name to value which can be a FTH Fixnum (in con-
	    trast to "fth_define_constant" below) or  any  other  FTH  object.
	    Returns value.
       FTH fth_define_constant(const char *name, FTH value, const char *doc)
	    Defines  constant  name to value which can be a C integer (in con-
	    trast to "fth_define" above) or any	other FTH object.  doc can  be
	    NULL  or a description of the constant for the help	word.  Returns
	    value where	C integers are converted to FTH	Fixnums, any other ob-
	    jects remain untouched.
       FTH fth_define_variable(const char *name, FTH value, const char *doc)
	    Defines global variable name to value which	can be a FTH Fixnum or
	    any	other FTH object, see the similar  function  fth_define()  for
	    constants above.  Returns value.
       int fth_defined_p(const char *name)
	    Returns 1 if name is defined in the	dictionary, otherwise 0.
       void fth_trace_var(FTH obj, FTH proc_or_xt)
	    Installs  a	 hook  on  the	specified global variable obj and adds
	    proc-or-xt with stack effect ( val -- res ).  The hook will	be ex-
	    ecuted after every variable	set via	to.
		  FTH test_var;

		  FTH
		  trace_cb(FTH val)
		  {
		      test_var = fth_number_mul(val, FTH_TWO);
		      return (val);
		  }

		  fth_variable_set("trace-foo",	FTH_ONE);
		  FTH prc = fth_make_proc_from_func("trace-cb",
		      trace_cb,	0, 1, 0, 0);
		  FTH obj = (FTH)FICL_WORD_NAME_REF("trace-foo");
		  fth_trace_var(obj, prc);
		  fth_string_eval(fth_make_string("2 to	trace-foo"));
		  => test_var == 4
		  fth_untrace_var(obj);
       void fth_untrace_var(FTH	obj)
	    Removes previously installed hook from obj.
       FTH fth_var_ref(FTH obj)
	    If obj is a	global variable, return	value, otherwise #f.
       FTH fth_var_set(FTH obj,	FTH value)
	    If obj is a	global variable, set value and	protect	 it  from  GC.
	    Returns value.
       FTH fth_variable_ref(const char *name)
	    Return FTH value from global variable or constant name.
       FTH fth_variable_set(const char *name, FTH value)
	    Set	or create global variable name to value.  Returns value.

   Regexp Object Type
       General help for	regexp can be found in regex(3)	and re_format(7).  For
       all  matching  functions	below, matched results or #f are stored	in the
       Regexp object FTH regexp.  The last match results are  also  stored  in
       the  read-only  variable	 FTH  regexp_results and can be	retrieved with
       fth_regexp_var_ref().
       int FTH_REGEXP_P(obj)
	    Returns 1 if obj is	a Regexp object, otherwise 0.
       FTH fth_make_regexp(const char *reg)
	    Returns a new Regexp object	from reg which may contain regular ex-
	    pressions.
		  FTH re = fth_make_regexp("bar");
		  FTH fs = fth_make_string("foobar");
		  fth_regexp_search(re,	fs, 0, -1); => 3

		  FTH re = fth_make_regexp("(B|b)+");
		  FTH fs = fth_make_string("foobar");
		  fth_regexp_search(re,	fs, 0, -1); => 3
       int fth_regexp_find(const char *reg, const char *str)
	    Searches reg in str	and returns first match's position or -1 if no
	    match was found.
       int fth_regexp_find_flags(const char *reg, const	char *str, int cflags)
	    Similar to fth_regexp_find() but with  the	extra  option  cflags,
	    which can be set to	an ored	value from the following constants:
		 REG_BASIC
		 REG_EXTENDED
		 REG_ICASE
		 REG_NOSUB
		 REG_NEWLINE
		 REG_NOSPEC
		 REG_PEND
       ficlInteger fth_regexp_match(FTH	regexp,	FTH string)
	    Searches  regexp  in string	and returns first match's length or -1
	    if no match	was found.
		  FTH re = fth_make_regexp("foo");
		  FTH fs = fth_make_string("foobar");
		  fth_regexp_match(re, fs); => 3

		  FTH re = fth_make_regexp("(bar)");
		  FTH fs = fth_make_string("foobar");
		  fth_regexp_match(re, fs); => 3

		  FTH re = fth_make_regexp(".*(bar)");
		  FTH fs = fth_make_string("foobar");
		  fth_regexp_match(re, fs); => 6
		  fth_object_value_ref(re, 0); => "foobar"
		  fth_object_value_ref(re, 1); => "bar"
		  fth_object_value_ref(re, 2); => #f
       FTH fth_regexp_replace(FTH regexp, FTH string, FTH replace)
	    Replaces first occurrence of regexp	 in  string  with  replace  if
	    found.   References	\1 to \9 in replace will be replaced by	corre-
	    sponding subexpressions.  If there are no corresponding subexpres-
	    sions, raises regexp-error exception.
		  FTH re = fth_make_regexp("(bar)");
		  FTH fs = fth_make_string("foobar");
		  FTH rp = fth_make_string("BAR");
		  fth_regexp_replace(re, fs, rp); => "fooBAR"

		  FTH re = fth_make_regexp("(foo)");
		  FTH fs = fth_make_string("foo-bar");
		  FTH rp = fth_make_string("***\\1***");
		  fth_regexp_replace(re, fs, rp); => "***foo***-bar"
       ficlInteger  fth_regexp_search(FTH  regexp,  FTH	 string,   ficlInteger
	    start, ficlInteger range)
	    Searches  regexp in	string from start for range characters and re-
	    turns first	match's	position or -1 if  no  match  was  found.   If
	    range is -1, the entire string will	be searched.
		  FTH re = fth_make_regexp("foo");
		  FTH fs = fth_make_string("foobar");
		  fth_regexp_search(re,	fs, 0, 2); => 0	(means #t)

		  FTH re = fth_make_regexp("(bar)");
		  FTH fs = fth_make_string("foobar");
		  fth_regexp_search(re,	fs, 0, 2); => -1 (means	#f)
		  fth_regexp_search(re,	fs, 3, 2); => 3
		  fth_object_value_ref(re, 0); => "bar"
		  fth_object_value_ref(re, 1); => "bar"
		  fth_object_value_ref(re, 2); => #f
       FTH fth_regexp_var_ref(ficlInteger index)
	    Returns  the  element  at index from the FTH regexp_results	array.
	    If index is	-1, the	entire array, if index is bigger than the  ar-
	    ray	length,	#f is returned.

   String Object Type
       int FTH_STRING_P(obj)
	    Returns 1 if obj is	a String object, otherwise 0.
		  FTH fs = fth_make_string("hello");
		  FTH_STRING_P(fs); => 1
		  FTH fs = FTH_NIL;
		  FTH_STRING_P(fs); => 0
       int FTH_CHAR_P(obj)
       int fth_char_p(obj)
	    Return 1 if	obj is a character, otherwise 0.
		  FTH ch = CHAR_TO_FTH('A');
		  FTH_CHAR_P(ch); => 1
		  FTH ch = INT_TO_FIX(65);
		  FTH_CHAR_P(ch); => 1
		  FTH ch = INT_TO_FIX(10);
		  FTH_CHAR_P(ch); => 0
       FTH fth_make_empty_string(void)
	    Returns an empty String object.
		  FTH fs = fth_make_empty_string(); => ""
		  fth_string_length(fs); => 0
       FTH fth_make_string(const char *str)
	    Returns  a	new  String  object  from C str.  If C string is "" or
	    NULL,    returns	String	  object    ""	  in	contrast    to
	    "fth_make_string_or_false()".
		  FTH fs = fth_make_string("hello"); =>	"hello"
		  fth_string_length(fs); => 5
		  FTH fs = fth_make_string("");	=> ""
		  fth_string_length(fs); => 0
       FTH fth_make_string_format(const	char *fmt, ...)
	    Returns  a	String	object according to the	extended printf(3) fmt
	    args.  The extensions are:
	    I fth_to_c_inspect
		 prints	inspect	string of any Fth object.
	    S fth_to_c_string
		 prints	string representation of any Fth object.
	    M fth_to_c_string_2
		 as "fth_to_c_string" but encloses strings in double quotes.
	    D fth_to_c_dump
		 prints	dump string of any Fth object.
		  FTH arg = fth_make_array_var(1, fth_make_string("foo"));
		  FTH fs = fth_make_string_format("%I",	arg);
		      => '#<array[1]:  #<string[3]: "foo">>'
		  FTH fs = fth_make_string_format("%S",	arg);
		      => '#( "foo" )'
		  FTH fs = fth_make_string_format("%M",	arg);
		      => '#( "foo" )'
		  FTH fs = fth_make_string_format("%D",	arg);
		      => '#( "foo" )'
       FTH fth_make_string_len(const char *str,	ficlInteger len)
	    Returns a new String object	constructed from C string str with  at
	    most len characters.  If the C string str is shorter than len, re-
	    turns a String object of str length	only.
		  FTH fs = fth_make_string_len("     ",	0); => ""
		  FTH fs = fth_make_string_len("     ",	3); => "   "
		  FTH fs = fth_make_string_len("xxxxx",	3); => "xxx"
		  FTH fs = fth_make_string_len("xxx", 5); => "xxx"
       FTH fth_make_string_or_false(const char *str)
	    If C string	is "", returns #f, otherwise like "fth_make_string".
		  FTH fs = fth_make_string_or_false("hello"); => "hello"
		  fth_string_length(fs); => 5
		  FTH fs = fth_make_string_or_false(""); => #f
		  fth_string_length(fs); => -1 (means #f)
       FTH fth_string_append(FTH string1, FTH string2)
	    Returns new	string from string1 + string2.
		  FTH s1 = fth_make_string("foo");
		  FTH s2 = fth_make_string("bar");
		  fth_string_append(s1,	s2); =>	"foobar"
       FTH fth_string_capitalize(FTH string)
	    Returns  the  string, not a	copy, with first character capitalized
	    and	remaining characters changed to	lowercase.
		  FTH fs = fth_make_string("foO");
		  fth_string_capitalize(fs); =>	"Foo"
		  fth_printf("%S", fs);	=> "Foo"
       char fth_string_c_char_ref(FTH string, ficlInteger index)
	    Returns character as C char	 at  position  index;  negative	 index
	    counts  from  backward.  Raises out-of-range exception if index is
	    not	in range of string.
		  FTH fs = fth_make_string("foo");
		  char c = fth_string_c_char_ref(fs, 1); => 111
       char fth_string_c_char_set(FTH string, ficlInteger index, char c)
	    Stores C char character c at position index; negative index	counts
	    from backward.  Raises out-of-range	exception if index is  not  in
	    range of string.
		  FTH fs = fth_make_string("foo");
		  char c = fth_string_c_char_set(fs, 1,	'e'); => 101
		  fth_printf("%S", fs);	=> "feo"
       FTH fth_string_char_ref(FTH string, ficlInteger index)
	    Returns  character as FTH object at	position index;	negative index
	    counts from	backward.  Raises out-of-range exception if  index  is
	    not	in range of string.
		  FTH fs = fth_make_string("foo");
		  FTH ch = fth_string_char_ref(fs, 1); => 111
       FTH fth_string_char_set(FTH string, ficlInteger index, FTH ch)
	    Stores  character ch at position index; negative index counts from
	    backward.  Raises out-of-range exception if	index is not in	 range
	    of string.
		  FTH fs = fth_make_string("foo");
		  FTH ch = fth_string_char_set(fs, 1, CHAR_TO_FTH('e')); => 101
		  fth_printf("%S", fs);	=> "feo"
       FTH fth_string_chomp(FTH	string)
	    Returns  the  string,  not a copy, with possible trailing `\n' re-
	    moved.
		  FTH fs = fth_make_string("foo\n");
		  fth_string_chomp(fs);	=> "foo"
		  FTH fs = fth_make_string("bar");
		  fth_string_chomp(fs);	=> "bar"
       FTH fth_string_copy(FTH string)
	    Returns a copy of String object string.
		  FTH s1 = fth_make_string("foo");
		  FTH s2 = fth_string_copy(s1);
		  s1 ==	s2 => 0
		  fth_string_equal_p(s1, s2); => 1
       FTH fth_string_delete(FTH string, ficlInteger index)
	    Deletes and	returns	character at position index from string; nega-
	    tive index counts from backward.  Raises out-of-range exception if
	    index is not in range of string.
		  FTH fs = fth_make_string("foo");
		  fth_string_delete(fs,	1); => 111 ('o')
		  fth_printf("%S", fs);	=> "fo"
       FTH fth_string_downcase(FTH string)
	    Returns the	string,	not a copy, all	characters  changed  to	 down-
	    case.
		  FTH fs = fth_make_string("Foo");
		  fth_string_downcase(fs); => "foo"
		  fth_printf("%S", fs);	=> "foo"
       int fth_string_equal_p(FTH obj1,	FTH obj2)
	    Compares  two strings with strcmp(3) and returns 1 for equal and 0
	    for	not equal (not -1 0 1 like strcmp).
		  FTH s1 = fth_make_string("foo");
		  FTH s2 = fth_make_string("bar");
		  FTH s3 = fth_make_string("foo");
		  fth_string_equal_p(s1, s2); => 0
		  fth_string_equal_p(s1, s3); => 1
		  fth_string_equal_p(s3, s3); => 1
       int fth_string_eval(FTH string)
	    Evaluate string; values already on stack can be accessed,  result-
	    ing	values remain on stack.
		  ficlVm *vm = FTH_FICL_VM();
		  FTH fs = fth_make_string("3 4	+");
		  fth_string_eval(fs); => puts 7 on stack
		  ficlStackPopInteger(vm->dataStack); => 7

		  ficlStackPushInteger(vm->dataStack, 7); => puts 7 on stack
		  FTH fs = fth_make_string("3 4	+ +");
		  fth_string_eval(fs); => puts 14 on stack
		  ficlStackPopInteger(vm->dataStack); => 14

		  ficlStackPushInteger(vm->dataStack, 7); => puts 7 on stack
		  FTH fs = fth_make_string("3 4	+ + . cr");
		  fth_string_eval(fs); => prints 14
       FTH fth_string_fill(FTH string, FTH char)
	    Fills string with char and returns changed String object.
		  FTH fs = fth_make_string("foo");
		  fth_string_fill(fs, CHAR_TO_FTH('a')); => "aaa"
		  fth_printf("%S", fs);	=> "aaa"
       FTH fth_string_find(FTH string, FTH key)
	    Returns  from  match  on if	string or regexp key exists in string,
	    otherwise #f.
		  FTH fs = fth_make_string("hello world");
		  FTH rs fth_make_string("l");
		  fth_string_find(fs, rs); => "llo world"
		  FTH rs = fth_make_string("ell");
		  fth_string_find(fs, rs); => "ello world"
		  FTH rs = fth_make_regexp("ell");
		  fth_string_find(fs, rs); => "ello world"
		  FTH rs = fth_make_regexp("k");
		  fth_string_find(fs, rs); => #f
       FTH fth_string_format(FTH string, FTH args)
	    fmt	is a printf(3) format string and args, which may be an	array,
	    a	single	 argument   or	 #f,   the  required  arguments.   See
	    "fth_make_string_format" for extra format signs.
		  FTH fmt = fth_make_string("%04d %8.2f	%b %X %o");
		  FTH args = fth_make_array_var(5,
		      INT_TO_FIX(128),
		      fth_make_float(M_PI),
		      INT_TO_FIX(255),
		      INT_TO_FIX(255),
		      INT_TO_FIX(255));
		  fth_string_format(fmt, args);
		      => "0128	   3.14	11111111 FF 377"

		  FTH fmt = fth_make_string("we	print %S");
		  FTH arg = INT_TO_FIX(10);
		  fth_string_format(fmt, arg); => "we print 10"

		  FTH fs = fth_make_string("simple string");
		  fth_string_format(fs,	FTH_FALSE); => "simple string"
		  fth_string_format(fs,	FTH_NIL); => "simple string"

		  FTH fs = fth_make_empty_string();
		  fth_string_format(fs,	args); => ""
       int fth_string_greater_p(FTH obj1, FTH obj2)
	    Compares two strings with strcmp(3)	and returns 1 for greater than
	    and	0 for less than.
		  FTH s1 = fth_make_string("foo");
		  FTH s2 = fth_make_string("bar");
		  FTH s3 = fth_make_string("foo");
		  fth_string_greater_p(s1, s2);	=> 0
		  fth_string_greater_p(s1, s3);	=> 0
		  fth_string_greater_p(s3, s3);	=> 0
       FTH fth_string_index(FTH	string,	FTH key)
	    Returns index of string key	in string or -1	if not found.
		  FTH fs = fth_make_string("hello world");
		  FTH rs fth_make_string("l");
		  fth_string_index(fs, rs); => 2
		  FTH rs = fth_make_string("orl");
		  fth_string_index(fs, rs); => 7
		  FTH rs = fth_make_string("k");
		  fth_string_index(fs, rs); => -1 (means #f)
       FTH fth_string_insert(FTH string, ficlInteger index, FTH	value)
	    Inserts string representation  of  value  to  string  at  position
	    index;  negative  index counts from	backward.  Raises out-of-range
	    exception if index is not in range of string.
		  FTH fs = fth_make_string("foo");
		  fth_string_insert(fs,	1, INT_TO_FIX(10)); => "f10oo"
       ficlInteger fth_string_length(FTH string)
	    If string is a String object, returns its length, otherwise	-1.
		  FTH fs = fth_make_string("hello");
		  fth_string_length(fs); => 5
		  fth_string_length((FTH)5); =>	-1 (means #f)
       int fth_string_less_p(FTH obj1, FTH obj2)
	    Compares two strings with strcmp(3)	and returns 1  for  less  than
	    and	0 for greater than.
		  FTH s1 = fth_make_string("foo");
		  FTH s2 = fth_make_string("bar");
		  FTH s3 = fth_make_string("foo");
		  fth_string_less_p(s1,	s2); =>	0
		  fth_string_less_p(s1,	s3); =>	0
		  fth_string_less_p(s3,	s3); =>	0
       int fth_string_member_p(FTH string, FTH key)
	    Returns 1 if string	or regexp key exists in	string,	otherwise 0.
		  FTH fs = fth_make_string("hello world");
		  FTH rs fth_make_string("l");
		  fth_string_member_p(fs, rs); => 1
		  FTH rs = fth_make_string("ell");
		  fth_string_member_p(fs, rs); => 1
		  FTH rs = fth_make_string("k");
		  fth_string_member_p(fs, rs); => 0
		  FTH rs = fth_make_regexp("ell");
		  fth_string_member_p(fs, rs); => 1
       int fth_string_not_equal_p(FTH obj1, FTH	obj2)
	    Compares  two  strings  with strcmp(3) and returns 1 for not equal
	    and	0 for not equal	(not -1	0 1 like strcmp).
		  FTH s1 = fth_make_string("foo");
		  FTH s2 = fth_make_string("bar");
		  FTH s3 = fth_make_string("foo");
		  fth_string_not_equal_p(s1, s2); => 1
		  fth_string_not_equal_p(s1, s3); => 0
		  fth_string_not_equal_p(s3, s3); => 0
       FTH fth_string_pop(FTH string)
	    Removes and	returns	last character of string.  If string is	empty,
	    returns #f.
		  FTH fs = fth_make_string("foo");
		  fth_string_pop(fs); => 111 ('o')
		  fth_string_pop(fs); => 111 ('o')
		  fth_string_pop(fs); => 102 ('f')
		  fth_string_pop(fs); => #f
       FTH fth_string_push(FTH string, FTH value)
	    Appends string representation  of  value  to  string  and  returns
	    changed String object.
		  FTH fs = fth_make_string("foo");
		  fth_string_push(fs, fth_make_string("	")); =>	"foo "
		  fth_string_push(fs, INT_TO_FIX(10)); => "foo 10"
       char* fth_string_ref(FTH	string)
	    Returns C string from Fth string or	NULL if	not a String object.
		  FTH fs = fth_make_string("hello");
		  fth_string_ref(fs); => "hello"
		  FTH fs = fth_make_empty_string();
		  fth_string_ref(fs); => ""
		  FTH fs = FTH_FALSE;
		  fth_string_ref(fs); => NULL
       FTH fth_string_replace(FTH string, FTH from, FTH	to)
	    Returns  the  string,  not	a  copy,  with string from replaced by
	    string to.	If to is the empty string, deletes the from part  from
	    string.
		  FTH fs = fth_make_string("foo");
		  FTH from = fth_make_string("o");
		  FTH to = fth_make_string("a");
		  fth_string_replace(fs, from, to); => "faa"
		  fth_printf("%S", fs);	=> "faa"

		  FTH fs = fth_make_string("foo");
		  FTH from = fth_make_string("oo");
		  FTH to = fth_make_string("a");
		  fth_string_replace(fs, from, to); => "fa"
		  fth_printf("%S", fs);	=> "fa"

		  FTH fs = fth_make_string("foo");
		  FTH from = fth_make_string("o");
		  FTH to = fth_make_string("");
		  fth_string_replace(fs, from, to); => "f"
		  fth_printf("%S", fs);	=> "f"
       FTH fth_string_reverse(FTH string)
	    Returns the	same String object string reversed.
		  FTH fs = fth_make_string("foo");
		  fth_string_reverse(fs); => "oof"
       FTH fth_string_scat(FTH string, const char *str)
	    Add	C string str to	an already existing String object string.
		  FTH fs = fth_make_empty_string(); => ""
		  fth_string_scat(fs, "hello");	=> "hello"
       FTH fth_string_sformat(FTH string, const	char *fmt, ...)
	    Add	 extended printf(3) fmt	args to	an already existing String ob-
	    ject.  See "fth_make_string_format".
		  FTH fs = fth_make_string("we want to ");
		  fth_string_sformat(fs, "print	%d times %f\n",	10, 3.14);
		    => "we want	to print 10 times 3.140000\n"
       FTH fth_string_shift(FTH	string)
	    Removes and	returns	first  character  of  string.	If  string  is
	    empty, returns #f.
		  FTH fs = fth_make_string("foo");
		  fth_string_shift(fs);	=> 102 ('f')
		  fth_string_shift(fs);	=> 111 ('o')
		  fth_string_shift(fs);	=> 111 ('o')
		  fth_string_shift(fs);	=> #f
       FTH fth_string_sncat(FTH	string,	const char *str, ficlInteger len)
	    Add	 C  string str of length len to	an already existing String ob-
	    ject string.
		  FTH fs = fth_make_empty_string(); => ""
		  fth_string_sncat(fs, ",  ", 2); => "hello, "
       FTH fth_string_split(FTH	string,	FTH sep)
	    Splits string using	sep as delimiter and returns result  as	 array
	    of	strings.  If sep is not	a string or regexp, delimiter is " \t"
	    (space and tab).
		  FTH fs = fth_make_string("foo:bar:baz:");
		  FTH sp = fth_make_string(":");
		  fth_string_split(fs, sp); => #( "foo"	"bar" "baz")
		  FTH sp = fth_make_regexp(":");
		  fth_string_split(fs, sp); => #( "foo"	"bar" "baz")
		  FTH fs = fth_make_string("foo	bar baz");
		  fth_string_split(fs, FTH_NIL); => #( "foo" "bar" "baz")
       FTH fth_string_substring(FTH  string,  ficlInteger  start,  ficlInteger
	    end)
	    Returns new	string from position start to, but excluding, position
	    end; negative index	counts from backward.  Raises out-of-range ex-
	    ception if index is	not in range of	string.
		  FTH fs = fth_make_string("hello world");
		  fth_string_substring(fs, 2, 4); => "ll"
		  fth_string_substring(fs, 0, -1); => "hello world"
		  fth_string_substring(fs, -4, -2); => "orl"
		  fth_string_substring(fs, -4, fth_string_length(fs)); => "orld"
       FTH fth_string_to_array(FTH string)
	    Converts string to an array	of characters.
		  FTH fs = fth_make_string("foo");
		  fth_string_to_array(fs); => #( 102 111 111 )
       FTH fth_string_unshift(FTH string, FTH value)
	    Adds string	representation of value	in front of string and returns
	    changed String object.
		  FTH fs = fth_make_string("foo");
		  fth_string_unshift(fs, fth_make_string(" "));	=> " foo"
		  fth_string_unshift(fs, INT_TO_FIX(10)); => "10 foo"
       FTH fth_string_upcase(FTH string)
	    Returns  the  string, not a	copy, all characters changed to	upper-
	    case.
		  FTH fs = fth_make_string("Foo");
		  fth_string_upcase(fs); => "FOO"
		  fth_printf("%S", fs);	=> "FOO"
       FTH fth_string_vformat(const char *fmt, FTH args)
	    Returns formatted String object corresponding to C string fmt  and
	    Fth	array args containing as much arguments	as fmt requires.
		  FTH args = fth_make_array_var(2,
		      INT_TO_FIX(10),
		      fth_make_float(3.14));
		  fth_string_vformat("print %d times %f", args);
		      => "print	10 times 3.140000"
       FTH fth_string_vsformat(FTH string, const char *fmt, va_list ap)
	    The	same as	"fth_string_sformat" except for	a va_list ap.

   Symbols
       int FTH_SYMBOL_P(obj)
	    Returns 1 if obj is	a symbol, otherwise 0.
       int fth_string_or_symbol_p(FTH obj)
	    Returns 1 if obj is	a String object	or a symbol, otherwise 0.
       char* fth_string_or_symbol_ref(FTH obj)
	    Returns C string name of obj or NULL.
       FTH fth_symbol(const char *name)
	    Returns value, the word address, of	symbol name; if	symbol doesn't
	    exist, creates it.
       int fth_symbol_equal_p(FTH obj1,	FTH obj2)
	    Returns  1 if obj1 and obj2	are symbols with identical names, oth-
	    erwise 0.
       int fth_symbol_p(const char *name)
	    Returns 1 if name is a symbol, otherwise 0.
       char* fth_symbol_ref(FTH	obj)
	    Returns C string name of symbol obj	 without  first	 sign  (')  or
	    NULL.

   Keywords
       int FTH_KEYWORD_P(obj)
	    Returns 1 if obj is	a keyword, otherwise 0.
       FTH fth_keyword(const char *name)
	    Returns  value,  the  word	address,  of  keyword name; if keyword
	    doesn't exist, creates it.
       int fth_keyword_equal_p(FTH obj1, FTH obj2)
	    Returns 1 if obj1 and obj2 are keywords with identical names, oth-
	    erwise 0.
       int fth_keyword_p(const char *name)
	    Returns 1 if name is a keyword, otherwise 0.
       char* fth_keyword_ref(FTH obj)
	    Returns C string name of keyword obj without  first	 sign  (:)  or
	    NULL.

   Exceptions
       int FTH_EXCEPTION_P(obj)
	    Returns 1 if obj is	an exception, otherwise	0.
       FTH fth_exception(const char *name)
	    Returns a new exception name.
       int fth_exception_equal_p(FTH obj1, FTH obj2)
	    Returns  1	if  obj1 and obj2 are exceptions with identical	names,
	    otherwise 0.
       FTH fth_exception_last_message_ref(FTH exc)
	    Returns last message of exception exc.  The	last message  was  set
	    after an exception was thrown with for example "fth_throw".
       void fth_exception_last_message_set(FTH exc, FTH	msg)
	    Sets message msg, a	string or #f, as the last message of exception
	    ex.	  This will be set automatically after an exception was	thrown
	    with for example "fth_throw".
       FTH fth_exception_message_ref(FTH exc)
	    Returns the	message	of exception exc.
       void fth_exception_message_set(FTH exc, FTH msg)
	    Sets message msg, a	string or #f, to exception exc.
       char* fth_exception_ref(FTH obj)
	    Returns C string name of exception obj without first sign  (')  or
	    NULL.
       FTH fth_make_exception(const char *name,	const char *message)
	    Creates  and  returns  the	new exception named name with message;
	    message may	be NULL.
       int fth_symbol_or_exception_p(FTH obj)
	    Returns 1 if obj is	a symbol or an exception, otherwise 0.
       FTH fth_symbol_or_exception_ref(FTH obj)
	    If obj is a	symbol,	converts it to an exception and	returns	it, if
	    obj	is an existing exception, returns it, otherwise	#f.
       FTH fth_symbol_to_exception(FTH obj)
	    Returns symbol obj as exception.

   Utilities
       This section mentions some utility  functions  for  memory  allocation,
       string handling,	evaluating, etc.

       Memory Allocation

       The  allocation	functions always return	a valid	pointer.  If memory is
       exhausted, abort	the program.
       void* fth_calloc(size_t size, size_t eltsize)
	    Allocates space for	size objects, each eltsize  bytes  in  length,
	    and	initializes the	memory to zero,	see calloc(3).
       void* fth_malloc(size_t size)
	    Allocates size bytes of uninitialized memory, see malloc(3).
       void* fth_realloc(void *p, size_t size)
	    Changes  the size of the previously	allocated memory referenced by
	    p to size, see realloc(3).
       void fth_free(void *p)
	    Causes the allocated memory	referenced by p	to be  made  available
	    for	 future	 allocations.	If  p  is  NULL, no action occurs, see
	    free(3).
       char* fth_strdup(const char *s)
	    Allocates sufficient memory	for a copy of the string s,  does  the
	    copy, and returns a	pointer	to it, see strdup(3).
       char* fth_strndup(const char *s,	size_t size)
	    Copies at most size	characters from	the string s always NUL	termi-
	    nating the copied string, see strndup(3).

       String Functions

       The string functions return always NUL terminated strings.
       char* fth_strcat(char *d, size_t	size, const char *s)
	    Appends s to d but not more	than size - 1 chars; appends terminat-
	    ing	`\0'.
       char* fth_strncat(char *d, size_t size, const char *s, size_t count)
	    Appends  count  chars  from	s to d but not more than size -	1; ap-
	    pends terminating `\0'.
       char* fth_strcpy(char *d, size_t	size, const char *s)
	    Copies s to	d but not more than size - 1 chars; appends  terminat-
	    ing	`\0'.
       char* fth_strncpy(char *d, size_t size, const char *s, size_t count)
	    Copies count chars from s to d but not more	than size - 1; appends
	    terminating	`\0'.
       size_t fth_strlen(const char *s)
	    Computes the length	of the string s.  If s is NULL,	returns	0, see
	    strlen(3).
       size_t fth_strnlen(const	char *s, size_t	maxsize)
	    Attempts  to  compute  the length of the string s, but never scans
	    beyond the first maxsize bytes of s.  If s is NULL,	returns	0, see
	    strnlen(3).

       Evaluate, Repl, and Throw Exception

       int fth_evaluate(ficlVm *vm, const char *buffer)
	    Evaluates buffer as	Forth input string.   Returns  the  evaluation
	    status,  uses  values  on  stack  and  leave evaluation results on
	    stack, if any.
       int fth_execute_xt(ficlVm *vm, ficlWord *word)
	    Executes ficlWord word.  Returns the evaluation status, uses  val-
	    ues	on stack and leave execution results on	stack, if any.
       void fth_repl(int argc, char **argv)
	    Starts  the	 Read-Eval-Print-Loop.	 argc  and  argv are not used.
	    Initializes	the tecla(7) library, reads the	history	 file,	evalu-
	    ates  the  input strings in	a loop,	and at the end writes the his-
	    tory file back.  Calls  "before-repl-hook",	 "before-prompt-hook",
	    and	"after-repl-hook".
       void fth_throw(FTH exc, const char *fmt,	...)
	    Throws  exception  exc with	text constructed from fmt and optional
	    arguments.	exc can	be an exception, a symbol, or #f.  fmt can  be
	    NULL or a printf-like format string	with corresponding arguments.
       void fth_throw_error(FTH	exc, FTH args)
	    Throws exception exc with text built from args.  If	args is	not an
	    array,  its	 string	 representation	is used.  If args is nil or an
	    empty array, a default string is used.  If args is an  array  with
	    one	 element,  this	 string	 is used.  If args is an array and its
	    first element is a format string  with  N  %s-format  signs,  args
	    should have	N more elements.
		  /*
		   * ARGS: any object
		   */
		  fth_throw_error(FTH_BAD_ARITY, proc);
		    => #<bad-arity in test-proc>
		  /*
		   * ARGS: nil or #()
		   */
		  fth_throw_error(FTH_BAD_ARITY, FTH_NIL);
		    => #<bad-arity: proc has bad arity>
		  /*
		   * ARGS: #( string )
		   */
		  fth_throw_error(FTH_BAD_ARITY,
		      FTH_LIST_1(fth_make_string("test-proc"));
		    => #<bad-arity in test-proc>
		  /*
		   * ARGS: #( fmt arg1 arg2 arg3 )
		   */
		  fth_throw_error(FTH_BAD_ARITY,
		      FTH_LIST_4(fth_make_string("%s: %s args require, got %s"),
				 proc,
				 FTH_TWO,
				 FTH_THREE));
		    => #<bad-arity in test-proc: 2 args	required, got 3>
       void fth_throw_list(FTH exc, FTH	args)
	    The	 same  as fth_throw_error except for replacing format signs ~A
	    and	~S with	%s.  This function exists for usage  in	 snd(1)	 where
	    these signs	appear.

       Miscellaneous

       char* fth_getenv(const char *name, char *def)
	    Returns  value  of	environment  variable name.  If	name isn't de-
	    fined, returns def,	see getenv(3).
       FILE* fth_popen(const char *command, const char *type)
	    If the environment variable	FTH_POPEN_SHELL	 is  set,  this	 shell
	    will  be  used to execute command.	If the environment variable is
	    not	set, us	the original popen(3) function to execute comment.
       int fth_set_argv(int from, int to, char **argv)
	    Sets *argc*	and *argc* to  values  from  upto  to  from  the  char
	    pointer array argv.
       char* fth_strerror(int n)
	    Looks up the language-dependent error message string corresponding
	    to the error number	n, see strerror(3).
       char* pop_cstring(ficlVm	*vm)
	    Converts  and  returns  a  String  object  from  data stack	to a C
	    string.
       void push_cstring(ficlVm	*vm, char *s)
	    Converts the C string s to a String	object and pushs  it  on  data
	    stack.
       void push_forth_string(ficlVm *vm, char *s)
	    Pushs  the C string	s on data stack	as Forth string	in the form of
	    addr len.

ENVIRONMENT
       FTH_DICTIONARY_SIZE
	    Overwrites default dictionary size (1024 * 1024).
       FTH_LOCALS_SIZE
	    Overwrites default number of locals	(2048).
       FTH_RETURN_SIZE
	    Overwrites default size of return stack (1024).
       FTH_STACK_SIZE
	    Overwrites default size of parameter stack (8192).

SEE ALSO
       fth(1), tecla(7).

HISTORY
       This manual page	describes version 1.4.5.  libfth  is  based  on	 Ficl,
       Forth-inspired command language,	version	4.0.31 written by John Sadler.

AUTHORS
       libfth	and   this   manual   page  were  written  by  Michael	Scholz
       <mi-scholz@users.sourceforge.net>.

BUGS
       Please report bugs to the author.

FreeBSD	ports 15.0		  2025/01/22			     LIBFTH(3)

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

home | help