Mercurial > hg > octave-lyh
diff src/defun.cc @ 2974:ebbc34ff7f66
[project @ 1997-05-15 19:36:16 by jwe]
author | jwe |
---|---|
date | Thu, 15 May 1997 19:42:59 +0000 |
parents | |
children | fd2080b2800e |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/defun.cc @@ -0,0 +1,133 @@ +/* + +Copyright (C) 1996, 1997 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "defun-int.h" +#include "ov.h" +#include "ov-builtin.h" +#include "ov-mapper.h" +#include "symtab.h" +#include "variables.h" + +// Install variables and functions in the symbol tables. + +void +install_builtin_mapper (void *mf_arg) +{ + octave_mapper *mf = static_cast<octave_mapper *> (mf_arg); + + symbol_record *sym_rec = global_sym_tab->lookup (mf->name (), true); + + unsigned int t + = symbol_def::BUILTIN_FUNCTION | symbol_def::MAPPER_FUNCTION; + + sym_rec->unprotect (); + sym_rec->define (mf, t); + sym_rec->document (mf->doc_string ()); + sym_rec->make_eternal (); + sym_rec->protect (); +} + +void +install_builtin_function (void *f_arg, const string& name, + const string& doc, bool is_text_fcn) +{ + octave_builtin::fcn f = static_cast<octave_builtin::fcn> (f_arg); + + symbol_record *sym_rec = global_sym_tab->lookup (name, true); + + unsigned int t = symbol_def::BUILTIN_FUNCTION; + + if (is_text_fcn) + t |= symbol_def::TEXT_FUNCTION; + + sym_rec->unprotect (); + sym_rec->define (new octave_builtin (f, name, doc), t); + sym_rec->document (doc); + sym_rec->make_eternal (); + sym_rec->protect (); +} + +static void +install_builtin_variable_as_function (const string& name, + const octave_value& val, + bool protect, bool eternal, + const string& help) +{ + symbol_record *sym_rec = global_sym_tab->lookup (name, true); + sym_rec->unprotect (); + + string tmp_help = help.empty () ? sym_rec->help () : help; + + sym_rec->define_as_fcn (val); + + sym_rec->document (tmp_help); + + if (protect) + sym_rec->protect (); + + if (eternal) + sym_rec->make_eternal (); +} + +void +install_builtin_variable (const string& name, const octave_value& value, + bool install_as_function, bool protect, + bool eternal, void *sv_fcn_arg, + const string& help_string) +{ + symbol_record::sv_function sv_fcn + = static_cast<symbol_record::sv_function> (sv_fcn_arg); + + if (install_as_function) + install_builtin_variable_as_function (name, value, protect, + eternal, help_string); + else + bind_builtin_variable (name, value, protect, eternal, + sv_fcn, help_string); +} + +void +alias_builtin (const string& alias, const string& name) +{ + symbol_record *sr_name = global_sym_tab->lookup (name); + + if (! sr_name) + panic ("can't alias to undefined name!"); + + symbol_record *sr_alias = global_sym_tab->lookup (alias, true); + + if (sr_alias) + sr_alias->alias (sr_name); + else + panic ("can't find symbol record for builtin function `%s'", + alias.c_str ()); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/