;;; sml-poly-ml.el: Modifies inferior-sml-mode defaults for Poly/ML.
;; Copyright (C) 1994,1997 Matthew J. Morley
;; $Revision: 3.9 $
;; $Date: 1997/06/23 09:21:25 $
;; This file is not part of GNU Emacs, but it is distributed under the
;; same conditions.
;; ====================================================================
;; 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, 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 GNU Emacs; see the file COPYING. If not, write to the
;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;; ====================================================================
;;; DESCRIPTION
;; To use this library just put
;;(autoload 'sml-poly-ml "sml-poly-ml" "Set up and run Poly/ML." t)
;; in your .emacs file. If you only ever use Poly/ML then you might as
;; well put something like
;;(setq sml-mode-hook
;; '(lambda() "SML mode defaults to Poly/ML"
;; (define-key sml-mode-map "\C-cp" 'sml-poly-ml)))
;; for your sml-load-hook. The command prompts for the program name
;; and the database to use, if any.
;; If you need to reset the default value of sml-program-name, or any
;; of the other compiler variables, put something like
;;(eval-after-load "sml-poly-ml" '(setq sml-program-name "whatever"))
;; in your .emacs -- or you can use the inferior-sml-{load,mode}-hooks
;; to achieve the same ends.
;;; CODE
(require 'sml-proc)
(defconst sml-poly-ml-error-regexp
"^\\(Error\\|Warning:\\) in '\\(.*\\)', line \\([0-9]+\\)"
"Default regexp matching Poly/ML error messages.")
;; The reg-expression used when looking for errors. Poly/ML errors:
;; Warning: in 'puzz.sml', line 28
;; Matches are not exhaustive.
;; Error
;; Value or constructor (tl) has not been declared
;; Found near tl(tl(tl(tl(N))))
;; (when input is from std_in -- i.e. entered directly at the prompt).
(defun sml-poly-ml-error-parser (pt)
"This function parses a Poly/ML error message into a 3 element list.
(file start-line start-col) required by `sml-next-error'."
(save-excursion
(goto-char pt)
(if (not (looking-at sml-poly-ml-error-regexp))
;; the user loses big time.
(list nil nil nil)
(list (match-string 2) ; the file
(string-to-int (match-string 3)) ; the start line
1)))) ; the start col
;;;###autoload
(defun sml-poly-ml (pfx)
"Set up and run Poly/ML.
Prefix argument means accept the defaults below.
Note: defaults set here will be clobbered if you setq them in the
inferior-sml-mode-hook.
sml-program-name