summaryrefslogtreecommitdiff
path: root/lisp/gnus/format-spec.el
diff options
context:
space:
mode:
authorGerd Moellmann <gerd@gnu.org>2000-09-19 13:40:08 +0000
committerGerd Moellmann <gerd@gnu.org>2000-09-19 13:40:08 +0000
commitc113de23613952ed67a3bca79363b30ab7e406c3 (patch)
treefd8063340169da2af53fa73046debd7a220904ac /lisp/gnus/format-spec.el
parent16409b0bb832ae376894cbad5892bf7623caeaaf (diff)
downloademacs-c113de23613952ed67a3bca79363b30ab7e406c3.tar.gz
*** empty log message ***
Diffstat (limited to 'lisp/gnus/format-spec.el')
-rw-r--r--lisp/gnus/format-spec.el71
1 files changed, 71 insertions, 0 deletions
diff --git a/lisp/gnus/format-spec.el b/lisp/gnus/format-spec.el
new file mode 100644
index 00000000000..6cd39ede721
--- /dev/null
+++ b/lisp/gnus/format-spec.el
@@ -0,0 +1,71 @@
+;;; format-spec.el --- functions for formatting arbitrary formatting strings
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: tools
+
+;; 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 2, 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; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defun format-spec (format specification)
+ "Return a string based on FORMAT and SPECIFICATION.
+FORMAT is a string containing `format'-like specs like \"bash %u %k\",
+while SPECIFICATION is an alist mapping from format spec characters
+to values."
+ (with-temp-buffer
+ (insert format)
+ (goto-char (point-min))
+ (while (search-forward "%" nil t)
+ (cond
+ ;; Quoted percent sign.
+ ((eq (char-after) ?%)
+ (delete-char 1))
+ ;; Valid format spec.
+ ((looking-at "\\([-0-9.]*\\)\\([a-zA-Z]\\)")
+ (let* ((num (match-string 1))
+ (spec (string-to-char (match-string 2)))
+ (val (cdr (assq spec specification))))
+ (delete-region (1- (match-beginning 0)) (match-end 0))
+ (unless val
+ (error "Invalid format character: %s" spec))
+ (insert (format (concat "%" num "s") val))))
+ ;; Signal an error on bogus format strings.
+ (t
+ (error "Invalid format string"))))
+ (buffer-string)))
+
+(defun format-spec-make (&rest pairs)
+ "Return an alist suitable for use in `format-spec' based on PAIRS.
+PAIRS is a list where every other element is a character and a value,
+starting with a character."
+ (let (alist)
+ (while pairs
+ (unless (cdr pairs)
+ (error "Invalid list of pairs"))
+ (push (cons (car pairs) (cadr pairs)) alist)
+ (setq pairs (cddr pairs)))
+ (nreverse alist)))
+
+(provide 'format-spec)
+
+;;; format-spec.el ends here