diff options
author | Stefan Kangas <stefankangas@gmail.com> | 2019-06-13 14:07:12 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2019-06-22 12:05:28 +0300 |
commit | bcaf5a140dd5cf15208042985f78fa1a1e0b7697 (patch) | |
tree | a07ce302292344e97e3c716af877d66116a323d1 /lisp/obsolete/mantemp.el | |
parent | d79fe1f7772a3ea6f998aeab10fe845f14493084 (diff) | |
download | emacs-bcaf5a140dd5cf15208042985f78fa1a1e0b7697.tar.gz emacs-bcaf5a140dd5cf15208042985f78fa1a1e0b7697.tar.bz2 emacs-bcaf5a140dd5cf15208042985f78fa1a1e0b7697.zip |
Move mantemp.el to obsolete/
* lisp/progmodes/mantemp.el: Move to obsolete/. (bug#34789)
* doc/emacs/ack.texi (Acknowledgments): Remove obsolete library
mantemp.el.
Diffstat (limited to 'lisp/obsolete/mantemp.el')
-rw-r--r-- | lisp/obsolete/mantemp.el | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/lisp/obsolete/mantemp.el b/lisp/obsolete/mantemp.el new file mode 100644 index 00000000000..ad638422c2b --- /dev/null +++ b/lisp/obsolete/mantemp.el @@ -0,0 +1,208 @@ +;;; mantemp.el --- create manual template instantiations from g++ 2.7.2 output + +;; Copyright (C) 1996, 2001-2019 Free Software Foundation, Inc. + +;; Author: Tom Houlder <thoulder@icor.fr> +;; Created: 10 Dec 1996 +;; Keywords: g++, templates +;; Obsolete-since: 27.1 + +;; This file is part of GNU Emacs. + +;; GNU Emacs 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 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This file is obsolete. For more information, see: +;; https://debbugs.gnu.org/34789 + +;; The following is a typical error message from g++ using STL (here +;; with split lines): +;; +;; AFile.o(.text+0x2d5): undefined reference to +;; `vector<double>::begin(void)' +;; AFile.o(.text+0x2e7): undefined reference to +;; `vector<double>::insert(double *, unsigned int, double const &)' +;; AnotherFile.o(.text+0x226b8): undefined reference to +;; `operator!=(rb_tree<basic_string<char>, pair<basic_string<char> +;; const, AClass *>, select1st<pair<basic_string<char> const, AClass +;; *>, basic_string<char> >, less<basic_string<char> > >::iterator +;; const &, rb_tree<basic_string<char>, pair<basic_string<char> +;; const, AClass *>, select1st<pair<basic_string<char> const, AClass +;; *>, basic_string<char> >, less<basic_string<char> > >::iterator +;; const &)' +;; +;; The message means that in the object file AFile.o there is one +;; uninstantiated template class, vector<double>, and in AnotherFile.o +;; there is one uninstantiated template function, operator!=(...). To +;; turn this output into manual template instantiations, copy from the +;; first name of an objective file (here this is AFile.o) to right +;; after the very last `'' of the output. Put this in a buffer and +;; call `mantemp-make-mantemps-buffer' with the point in the buffer. +;; You can also use `mantemp-make-mantemps-region' directly on the +;; region if the output is already in Emacs. +;; +;; The resulting buffer yields (connect the three output lines above +;; if you want to try): +;; +;; template operator!=(rb_tree<basic_string<char>, +;; pair<basic_string<char> const, AClass *>, +;; select1st<pair<basic_string<char> const, AClass *>, +;; basic_string<char> >, less<basic_string<char> > >::iterator const +;; &, rb_tree<basic_string<char>, pair<basic_string<char> const, +;; AClass *>, select1st<pair<basic_string<char> const, AClass *>, +;; basic_string<char> >, less<basic_string<char> > >::iterator const +;; &); +;; template class vector<double>; +;; +;; which can be included in your C++ program. However, its probably +;; better to include the necessary header files in the buffer and +;; compile it as a stand alone implementation file. +;; +;; Sometimes, an uninstantiated template may cause a message like the +;; following +;; +;; main.cc:66: invalid use of undefined type +;; `struct valarray<double,arrayminusopclass<double,c_array<double> > >' +;; +;; Follow the same procedure as above and the line is changed to +;; +;; template struct valarray<double, +;; arrayminusopclass<double,c_array<double> > >; + +;; g++ does not output the templates that are needed by the +;; uninstantiated templates. Therefore you will often get new error +;; messages after the first instantiations have been included and you +;; must repeat the operation. + +;;; Code: + +(defun mantemp-remove-comments () + "Remove g++ comments surrounding each function and member function." + (save-excursion + (goto-char (point-min)) + (message "Removing comments") + (while (re-search-forward "^[a-zA-Z.()+0-9: ]*`\\|'.*$" nil t) + (replace-match "")))) + +(defun mantemp-remove-memfuncs () + "Remove member function extensions so that only class names remain." + (save-excursion + ;; Remove conversion operator extensions. + (goto-char (point-min)) + (message "Removing member function extensions") + (while (re-search-forward + "^[a-zA-Z :&*<>~=,0-9+]*>::operator " nil t nil) + (progn + (backward-char 11) + (delete-region (point) (line-end-position)))) + ;; Remove other member function extensions. + (goto-char (point-min)) + (message "Removing member function extensions") + (while (re-search-forward "^[a-zA-Z :&*<>~=,0-9+]*>::" nil t nil) + (progn + (backward-char 2) + (delete-region (point) (line-end-position)))))) + +(defun mantemp-sort-and-unique-lines () + "Eliminate all consecutive duplicate lines in the buffer." + (save-excursion + (message "Sorting") + (sort-regexp-fields nil "^.*$" "\\&" + (point-min) + (point-max)) + (goto-char (point-min)) + (message "Removing consecutive duplicate lines") + (while (re-search-forward "\\(^.+\\)\n\\1" nil t nil) + (progn + (forward-line -1) + (beginning-of-line) + (delete-region (point) (progn (forward-line 1) (point))))))) + +(defun mantemp-insert-cxx-syntax () + "Insert C++ syntax around each template class and function. +Insert `template class' for classes, `template' for +functions and add the statement delimiter `;' at the end of +the lines." + (save-excursion + ;; Insert ';' at the end of each nonempty line. + (goto-char (point-min)) + (message "Inserting `;' at the ends") + (while (re-search-forward ".+$" nil t) + (progn + (insert ";") + (if (not (equal (point) (point-max))) + (forward-char)))) + ;; We first insert 'template class' at each nonempty line and + ;; subsequently remove 'class' for functions so we don't need to + ;; both scan for classes and functions. + (goto-char (point-min)) + (message "Inserting 'template class' for classes") + (while (re-search-forward "^.+" nil t) + (progn + (beginning-of-line) + (if (looking-at "struct[\\t ]+\\|class[\\t ]+") + (insert "template ") + (insert "template class ")))) + (goto-char (point-min)) + (message "Inserting 'template' for functions") + (while (re-search-forward + "^template class [a-zA-Z :&*<>~=,0-9+!]*(" nil t nil) + (progn + (beginning-of-line) + (forward-word-strictly 1) + (delete-region (point) (progn (forward-word-strictly 1) (point))))))) + +(defun mantemp-make-mantemps () + "Gathering interface to the functions modifying the buffer." + (mantemp-remove-comments) + (mantemp-remove-memfuncs) + (mantemp-sort-and-unique-lines) + (mantemp-insert-cxx-syntax)) + +(defun mantemp-make-mantemps-buffer () + "Make manual template instantiations from g++ error messages in the buffer. +Scan the output of g++ describing uninstantiated template +classes and functions and generate the corresponding C++ +manual template instantiations. The output is supposed to +have been placed in the current buffer and the current buffer +should otherwise be empty. + +See the commentary in file mantemp.el for an example of use." + (interactive) + (mantemp-make-mantemps) + (message "Done")) + +(defun mantemp-make-mantemps-region () + "Make manual template instantiations from g++ error messages in the region. +This function does the same thing as `mantemp-make-mantemps-buffer', +but operates on the region." + (interactive) + (let ((cur-buf (current-buffer)) + (mantemp-buffer (generate-new-buffer "*mantemp*")) + (str (buffer-substring (mark) (point)))) + ;; Copy the region to a temporary buffer, make the C++ code there + ;; and copy the result back to the current buffer. + (set-buffer mantemp-buffer) + (insert str) + (mantemp-make-mantemps) + (setq str (buffer-string)) + (set-buffer cur-buf) + (insert str) + (kill-buffer mantemp-buffer)) + (message "Done")) + +(provide 'mantemp) + +;;; mantemp.el ends here |