--- INSTALL | 3 +- ginac/Makefile.am | 19 +---- ginac/parser/builtin_fcns.def | 14 ---- ginac/parser/default_reader.cpp | 157 +++++++++++++++++++++++++++++++++++++++ ginac/parser/default_reader.tpl | 145 ------------------------------------ 5 files changed, 160 insertions(+), 178 deletions(-) delete mode 100644 ginac/parser/builtin_fcns.def create mode 100644 ginac/parser/default_reader.cpp delete mode 100644 ginac/parser/default_reader.tpl diff --git a/INSTALL b/INSTALL index 3be16c1..3c188b6 100644 --- a/INSTALL +++ b/INSTALL @@ -30,8 +30,7 @@ Known not to work with: is missing there. If you install from git, you also need GNU autoconf (>=2.59), automake (>=1.8), -libtool (>= 1.5), bison (>= 2.3), flex (>= 2.5.33), autogen (>= 5.6.0) to be -installed. +libtool (>= 1.5), bison (>= 2.3), flex (>= 2.5.33) to be installed. INSTALLATION diff --git a/ginac/Makefile.am b/ginac/Makefile.am index bc2e1b8..dce098d 100644 --- a/ginac/Makefile.am +++ b/ginac/Makefile.am @@ -13,7 +13,7 @@ libginac_la_SOURCES = add.cpp archive.cpp basic.cpp clifford.cpp color.cpp \ parser/parse_binop_rhs.cpp \ parser/parser.cpp \ parser/parse_context.cpp \ - parser/builtin_fcns.cpp \ + parser/default_reader.cpp \ parser/lexer.cpp \ parser/lexer.h \ parser/parser_compat.cpp \ @@ -67,22 +67,7 @@ ginacinclude_HEADERS = ginac.h add.h archive.h assertion.h basic.h class_info.h parser/parser.h \ parser/parse_context.h -EXTRA_DIST = function.pl version.h.in \ -parser/default_reader.tpl parser/builtin_fcns.def - -# Files produced by autogen(1) from templates -$(srcdir)/parser/builtin_fcns.cpp: $(srcdir)/parser/builtin_fcns.def $(srcdir)/parser/default_reader.tpl - set -e; if [ -n "$(AUTOGEN)" ]; then \ - cd $(srcdir)/parser; \ - $(AUTOGEN) -T default_reader.tpl builtin_fcns.def; \ - elif [ -f $@ ]; then \ - echo "WARNING: AutoGen is not available, the \"$@\" file WON'T be re-generated"; \ - else \ - echo "*** ERROR: the \"$@\" file does not exist, and AutoGen is not installed on your system"; \ - echo "*** Please install AutoGen (http://www.gnu.org/software/autogen)"; \ - exit 1; \ - fi - +EXTRA_DIST = function.pl version.h.in # Files which are generated by perl scripts $(srcdir)/function.h $(srcdir)/function.cpp: $(srcdir)/function.pl diff --git a/ginac/parser/builtin_fcns.def b/ginac/parser/builtin_fcns.def deleted file mode 100644 index 96cd0a2..0000000 --- a/ginac/parser/builtin_fcns.def +++ /dev/null @@ -1,14 +0,0 @@ -Autogen definitions ginacfcns; - -/* Thease are not functions, but anyway ... */ -function = { name = "sqrt"; }; - -function = { - name = "pow"; - args = 2; -}; - -function = { - name = "power"; - args = 2; -}; diff --git a/ginac/parser/default_reader.cpp b/ginac/parser/default_reader.cpp new file mode 100644 index 0000000..4f8c69c --- /dev/null +++ b/ginac/parser/default_reader.cpp @@ -0,0 +1,157 @@ +/** @file default_reader.cpp + * + * Implementation of the default and builtin readers (part of GiNaC's parser). + **/ + +/* + * GiNaC Copyright (C) 1999-2011 Johannes Gutenberg University Mainz, Germany + * + * This program 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 of the License, or + * (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "parse_context.h" +#include "power.h" +#include "operators.h" +#include "inifcns.h" +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_STDINT_H +#include <stdint.h> // for uintptr_t +#endif + +namespace GiNaC +{ + +static ex sqrt_reader(const exvector& ev) +{ + return GiNaC::sqrt(ev[0]); +} +static ex pow_reader(const exvector& ev) +{ + return GiNaC::pow(ev[0], ev[1]); +} +static ex power_reader(const exvector& ev) +{ + return GiNaC::power(ev[0], ev[1]); +} + + +// function::registered_functions() is protected, but we need to access it +// TODO: add a proper const method to the `function' class, so we don't +// need this silly hack any more. +class registered_functions_hack : public function +{ +public: + static const std::vector<function_options>& get_registered_functions() + { + return function::registered_functions(); + } +private: + registered_functions_hack(); + registered_functions_hack(const registered_functions_hack&); + registered_functions_hack& operator=(const registered_functions_hack&); +}; + +// Encode an integer into a pointer to a function. Since functions +// are aligned (the minimal alignment depends on CPU architecture) +// we can distinguish between pointers and integers. +static reader_func encode_serial_as_reader_func(unsigned serial) +{ + uintptr_t u = (uintptr_t)serial; + u = (u << 1) | (uintptr_t)1; + reader_func ptr = (reader_func)((void *)u); + return ptr; +} + +const prototype_table& get_default_reader() +{ + using std::make_pair; + static bool initialized = false; + static prototype_table reader; + if (!initialized) { + + reader[make_pair("sqrt", 1)] = sqrt_reader; + reader[make_pair("pow", 2)] = pow_reader; + reader[make_pair("power", 2)] = power_reader; + std::vector<function_options>::const_iterator it = + registered_functions_hack::get_registered_functions().begin(); + std::vector<function_options>::const_iterator end = + registered_functions_hack::get_registered_functions().end(); + unsigned serial = 0; + for (; it != end; ++it) { + prototype proto = make_pair(it->get_name(), it->get_nparams()); + reader[proto] = encode_serial_as_reader_func(serial); + ++serial; + } + initialized = true; + } + return reader; +} + +const prototype_table& get_builtin_reader() +{ + using std::make_pair; + static bool initialized = false; + static prototype_table reader; + if (!initialized) { + + reader[make_pair("sqrt", 1)] = sqrt_reader; + reader[make_pair("pow", 2)] = pow_reader; + reader[make_pair("power", 2)] = power_reader; + enum { + log, + exp, + sin, + cos, + tan, + asin, + acos, + atan, + sinh, + cosh, + tanh, + asinh, + acosh, + atanh, + atan2, + Li2, + Li3, + zetaderiv, + Li, + S, + H, + lgamma, + tgamma, + beta, + factorial, + binomial, + Order, + NFUNCTIONS + }; + std::vector<function_options>::const_iterator it = + registered_functions_hack::get_registered_functions().begin(); + unsigned serial = 0; + for ( ; serial<NFUNCTIONS; ++it, ++serial ) { + prototype proto = make_pair(it->get_name(), it->get_nparams()); + reader[proto] = encode_serial_as_reader_func(serial); + } + initialized = true; + } + return reader; +} + +} // namespace GiNaC diff --git a/ginac/parser/default_reader.tpl b/ginac/parser/default_reader.tpl deleted file mode 100644 index 006fb90..0000000 --- a/ginac/parser/default_reader.tpl +++ /dev/null @@ -1,145 +0,0 @@ -[+ AutoGen5 template .cpp +][+ -COMMENT a part of GiNaC parser -- construct functions from a byte stream. -+][+ -(use-modules (ice-9 format)) - -(define (sequence start end . step) - (let ((step (if (null? step) 1 (car step)))) - (let loop ((n start)) - (if (> n end) '() (cons n (loop (+ step n))))))) -+]/* -[+ (dne " * " " * " ) +] - * - * If you want to change this file, edit either `[+ (def-file) +]' or - * `[+ (tpl-file) +]' file, and run the following command: - * - * autogen -T [+ (tpl-file) +] [+ (def-file) +] - */ -#include "parse_context.h" -#include "power.h" -#include "operators.h" -#include "inifcns.h" -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef HAVE_STDINT_H -#include <stdint.h> // for uintptr_t -#endif - -namespace GiNaC -{ -[+ FOR function +] -static ex [+ (get "name") +]_reader(const exvector& ev) -{ - return GiNaC::[+ (get "name") +]([+ - (let ((nargs (if (exist? "args") - (string->number (get "args")) 1))) - (format '#f "~{ev[~a]~^, ~}" (sequence 0 (- nargs 1)))) +]); -}[+ ENDFOR +] - -// function::registered_functions() is protected, but we need to access it -class registered_functions_hack : public function -{ -public: - static const std::vector<function_options>& get_registered_functions() - { - return function::registered_functions(); - } -private: - registered_functions_hack(); - registered_functions_hack(const registered_functions_hack&); - registered_functions_hack& operator=(const registered_functions_hack&); -}; - -// Encode an integer into a pointer to a function. Since functions -// are aligned (the minimal alignment depends on CPU architecture) -// we can distinguish between pointers and integers. -static reader_func encode_serial_as_reader_func(unsigned serial) -{ - uintptr_t u = (uintptr_t)serial; - u = (u << 1) | (uintptr_t)1; - reader_func ptr = (reader_func)((void *)u); - return ptr; -} - -const prototype_table& get_default_reader() -{ - using std::make_pair; - static bool initialized = false; - static prototype_table reader; - if (!initialized) { - [+ FOR function +] - reader[make_pair("[+ (get "name") +]", [+ - (if (exist? "args") (get "args") "1") - +])] = [+ (get "name") +]_reader;[+ - ENDFOR +] - std::vector<function_options>::const_iterator it = - registered_functions_hack::get_registered_functions().begin(); - std::vector<function_options>::const_iterator end = - registered_functions_hack::get_registered_functions().end(); - unsigned serial = 0; - for (; it != end; ++it) { - prototype proto = make_pair(it->get_name(), it->get_nparams()); - reader[proto] = encode_serial_as_reader_func(serial); - ++serial; - } - initialized = true; - } - return reader; -} - -const prototype_table& get_builtin_reader() -{ - using std::make_pair; - static bool initialized = false; - static prototype_table reader; - if (!initialized) { - [+ FOR function +] - reader[make_pair("[+ (get "name") +]", [+ - (if (exist? "args") (get "args") "1") - +])] = [+ (get "name") +]_reader;[+ - ENDFOR +] - enum { - log, - exp, - sin, - cos, - tan, - asin, - acos, - atan, - sinh, - cosh, - tanh, - asinh, - acosh, - atanh, - atan2, - Li2, - Li3, - zetaderiv, - Li, - S, - H, - lgamma, - tgamma, - beta, - factorial, - binomial, - Order, - NFUNCTIONS - }; - std::vector<function_options>::const_iterator it = - registered_functions_hack::get_registered_functions().begin(); - unsigned serial = 0; - for ( ; serial<NFUNCTIONS; ++it, ++serial ) { - prototype proto = make_pair(it->get_name(), it->get_nparams()); - reader[proto] = encode_serial_as_reader_func(serial); - } - initialized = true; - } - return reader; -} - -} // namespace GiNaC -- 1.7.2.5