]> git.eshelyaron.com Git - emacs.git/commitdiff
Move here from gnus/.
authorGlenn Morris <rgm@gnu.org>
Sat, 1 Dec 2007 21:09:32 +0000 (21:09 +0000)
committerGlenn Morris <rgm@gnu.org>
Sat, 1 Dec 2007 21:09:32 +0000 (21:09 +0000)
lisp/ChangeLog
lisp/format-spec.el [new file with mode: 0644]

index 4ae4f5dc23c40effedd439c126d6c267a0d0d8a5..f32f7c86531a5c9c3a0427d82140559ea17d70b6 100644 (file)
@@ -15,7 +15,7 @@
 
 2007-12-01  Glenn Morris  <rgm@gnu.org>
 
-       * hex-util.el, sha1.el: Move here from gnus/.
+       * format-spec.el, hex-util.el, sha1.el: Move here from gnus/.
 
        * net/dig.el: Move here from gnus/.
        (dig-mode): Replace gnus-run-mode-hooks with equivalent expansion.
diff --git a/lisp/format-spec.el b/lisp/format-spec.el
new file mode 100644 (file)
index 0000000..951f9ae
--- /dev/null
@@ -0,0 +1,82 @@
+;;; format-spec.el --- functions for formatting arbitrary formatting strings
+
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007 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 3, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, 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.  Any text properties on a %-spec itself are propagated to
+the text that it generates."
+  (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))))
+         (unless val
+           (error "Invalid format character: `%%%c'" spec))
+         ;; Pad result to desired length.
+          (let ((text (format (concat "%" num "s") val)))
+           ;; Insert first, to preserve text properties.
+            (insert-and-inherit text)
+            ;; Delete the specifier body.
+            (delete-region (+ (match-beginning 0) (length text))
+                           (+ (match-end 0) (length text)))
+            ;; Delete the percent sign.
+            (delete-region (1- (match-beginning 0)) (match-beginning 0)))))
+       ;; 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)
+
+;;; arch-tag: c22d49cf-d167-445d-b7f1-2504d4173f53
+;;; format-spec.el ends here