     DEFUNC(3)              C LIBRARY FUNCTIONS              DEFUNC(3)

     NAME
          defunc -- a portable C library package for runtime  function
          constructing.

     DESCRIPTION
          defunc (Dynamic  Expressible  Function  Constructing)  is  a
          portable  C  library package for constructing functions from
          runtime inputted expressions.

          defunc  library  function  dfopen()  accepts  an  expression
          string and, on success, returns a function pointer. e.g.

               #include <defunc.h>

               foo()
               {
                   double (*fnctptr)();
                     ....
                   fnctptr = dfopen("(x*x+y*y)^0.5");
                     ....
               };

          The function dfopen() is reentrant. That is, you can repeat-
          edly  call  dfopen()  without worry about the new result may
          overlap or damage the old one, provided they are assigned to
          different lvalues. e.g.

               double (*fnctptr1)();
               double (*fnctptr2)();
                ...
               fnctptr1 = dfopen("exp(-x*x)");
               fnctptr2 = dfopen("exp(-x)*sin(x)");
                ...

          Then, fnctptr1 and fnctptr2  will  point  to  two  different
          functions.

          Function dfopen() parses the expression be passed  based  on
          tokens  it  recognized. Except for numerical string constant
          tokens(i.e. anonymous  constant  tokens)  and  14  build  in
          tokens  "+",  "-",  "*", "/", "^", "**", "(", ")", ",", "=",
          ";", "[", "]"  and  "$",  all  other  tokens  are  external.
          External tokens include argument tokens, function tokens and
          named constant tokens. They are stored  in  a  global  token
          table.  They can be set/reset or appended/deleted statically
          as well as dynamically. e.g.

               nameargu("re", "im");

          This will reset argument tokens to "re" and "im"(the default
          are "x" and "y").

     defunc 1.3          Last change: January 1994                   1

     DEFUNC(3)              C LIBRARY FUNCTIONS              DEFUNC(3)

               namefnct("log", log);
               namefnct("ln" , log);

          Here, the external function log()  has  been  added  to  the
          token list with 2 alias names "log" and "ln".

               namecnst("pi", 2.0*asin(1.0));
               namecnst("PI", 2.0*asin(1.0));

          This will add a named constant token to the list with  alias
          names "pi" and "PI" and value 3.1415926... .

               clrcnst("PI");

          This will delete the constant token  "PI"  from  the  global
          token  table.  After an external token has been put into the
          global token list, it can be used in expressions  passed  to
          dfopen().  e.g. After you put the exponential function exp()
          into token table with

               namefnct("exp", exp);
                 /* add external function exp() to the token table */

          Than you can use it to construct a gaussian function dynami-
          cally as

               double (*gauss)();
                ...
               gauss = dfopen("exp(-x*x)");

          Argument tokens, named constant tokens and dynamically  con-
          structed  functions  can be reset or added to the token list
          dynamically. This can be done directly from  the  expression
          passed to dfopen() function. e.g.

               fnctptr = dfopen("Rho(re, im)=(re*re+im*im)^0.5");

          This will reset the argument tokens to "re" and "im", return
          a  duplex  function pointer and add this function pointer to
          the global token list with name "Rho".

               dfopen("gauss(x)=exp(-x*x)");

          This sets the first argument  tokens  to  "x"  and  put  the
          return  function pointer to the global token table with name
          "gauss" while the return function pointer is not assigned to
          any lvalue. Now, the token "gauss" is recognizable by defunc
          and you can in turn use it to construct new  function.  Such
          as

               dfopen("gauss2d(x,y)=gauss(x)*gauss(y)");

     defunc 1.3          Last change: January 1994                   2

     DEFUNC(3)              C LIBRARY FUNCTIONS              DEFUNC(3)

          will return a 2 dimension gaussian function and  put  it  to
          token  table  with  name "gauss2d". If you don't want this 2
          dimension gaussian function be putted into the  token  table
          but you still want reset the argument tokens, for example to
          "a", "b", you can use

               fnctptr = dfopen("$(a, b) = gauss(a)*gauss(b)");

          or

               fnctptr = dfopen("$gauss(a, b) = gauss(a)*gauss(b)");

          Here, fnctptr is a function pointer to accept  the  returned
          value from dfopen().

          Named constant tokens can also be added to  the  token  list
          from expression passed to dfopen(). e.g.

               fnctptr = dfopen("pi = 4*atan2(1,1)");

          This will return a constant function and add  a  named  con-
          stant  token  to  the token list with value 3.1415926... and
          name "pi".

     SEE ALSO
          dfopen(3)

     AUTHOR
          Ke Jin
          Physics Department
          Queen's University
          Kingston, Ontario
          Canada K7L 3N6
          jinke@sparky.phy.queensu.ca

     BUGS
          Report bugs of defunc library to the author by email.

     defunc 1.3          Last change: January 1994                   3