From 15689fa7d3440eae007b05328b0f8315695fa9f5 Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Sat, 1 Dec 2007 21:09:32 +0000 Subject: [PATCH] Move here from gnus/. --- lisp/ChangeLog | 2 +- lisp/format-spec.el | 82 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 lisp/format-spec.el diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4ae4f5dc23c..f32f7c86531 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -15,7 +15,7 @@ 2007-12-01 Glenn Morris - * 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 index 00000000000..951f9aecb81 --- /dev/null +++ b/lisp/format-spec.el @@ -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 +;; 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 -- 2.39.2