*** src/DLD-FUNCTIONS/fsolve.cc.orig2 2003-11-17 21:19:07.000000000 +0100 --- src/DLD-FUNCTIONS/fsolve.cc 2004-08-04 22:29:31.000000000 +0200 *************** *** 53,61 **** static bool warned_fcn_imaginary = false; static bool warned_jac_imaginary = false; - // Is this a recursive call? - static int call_depth = 0; - int hybrd_info_to_fsolve_info (int info) { --- 53,58 ---- *************** *** 246,261 **** unwind_protect::begin_frame ("Ffsolve"); ! unwind_protect_int (call_depth); ! call_depth++; ! ! if (call_depth > 1) ! FSOLVE_ABORT1 ("invalid recursive call"); int nargin = args.length (); if (nargin == 2 && nargout < 4) { fsolve_fcn = 0; fsolve_jac = 0; --- 243,256 ---- unwind_protect::begin_frame ("Ffsolve"); ! unwind_protect_ptr (fsolve_fcn); ! unwind_protect_ptr (fsolve_jac); int nargin = args.length (); if (nargin == 2 && nargout < 4) { + std::string fcn_name, fname, jac_name, jname; fsolve_fcn = 0; fsolve_jac = 0; *************** *** 264,273 **** switch (f_arg.rows ()) { case 1: fsolve_fcn = extract_function ! (f_arg, "fsolve", "__fsolve_fcn__", ! "function y = __fsolve_fcn__ (x) y = ", ! "; endfunction"); break; case 2: --- 259,273 ---- switch (f_arg.rows ()) { case 1: + fcn_name = "__fsolve_fcn__"; + while (symbol_exist (fcn_name, "any")) + fcn_name.append ("X"); + + fname = "function y = "; + fname.append (fcn_name); + fname.append (" (x) y = "); fsolve_fcn = extract_function ! (f_arg, "fsolve", fcn_name, fname, "; endfunction"); break; case 2: *************** *** 276,292 **** if (! error_state) { fsolve_fcn = extract_function ! (tmp(0), "fsolve", "__fsolve_fcn__", ! "function y = __fsolve_fcn__ (x) y = ", ! "; endfunction"); if (fsolve_fcn) { fsolve_jac = extract_function ! (tmp(1), "fsolve", "__fsolve_jac__", ! "function jac = __fsolve_jac__ (x) jac = ", ! "; endfunction"); if (! fsolve_jac) fsolve_fcn = 0; --- 276,302 ---- if (! error_state) { + fcn_name = "__fsolve_fcn__"; + while (symbol_exist (fcn_name, "any")) + fcn_name.append ("X"); + + fname = "function y = "; + fname.append(fcn_name); + fname.append (" (x) y = "); fsolve_fcn = extract_function ! (tmp(0), "fsolve", fcn_name, fname, "; endfunction"); if (fsolve_fcn) { + jac_name = "__fsolve_fcn__"; + while (symbol_exist (jac_name, "any")) + jac_name.append ("X"); + + jname = "function jac = "; + jname.append(fcn_name); + jname.append (" (x) jac = "); fsolve_jac = extract_function ! (tmp(1), "fsolve", jac_name, jname, "; endfunction"); if (! fsolve_jac) fsolve_fcn = 0; *************** *** 319,324 **** --- 329,340 ---- int info; ColumnVector soln = nleqn.solve (info); + // XXX FIXME XXX Should we be manipulating the symbol table directly + if (fcn_name.length()) + fbi_sym_tab->clear_function (fcn_name); + if (jac_name.length()) + fbi_sym_tab->clear_function (jac_name); + if (! error_state) { std::string msg = nleqn.error_message ();