emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master e260064 3/3: Low-level diagnostics now use ‘text-q


From: Paul Eggert
Subject: [Emacs-diffs] master e260064 3/3: Low-level diagnostics now use ‘text-quoting-style’
Date: Fri, 14 Aug 2015 22:56:07 +0000

branch: master
commit e26006404ad1e9b273aafffbbb24074fba5bab37
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Low-level diagnostics now use ‘text-quoting-style’
    
    * src/doprnt.c (doprnt):
    Format ` and ' as per ‘text-quoting-style’.
    * src/xdisp.c (vmessage, message): Mention that the format should
    not contain ` or '.
---
 src/doprnt.c |   60 +++++++++++++++++++++++++++++++++++++--------------------
 src/xdisp.c  |    6 ++--
 2 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/src/doprnt.c b/src/doprnt.c
index 68750f5..7c5a6af 100644
--- a/src/doprnt.c
+++ b/src/doprnt.c
@@ -49,8 +49,9 @@ along with GNU Emacs.  If not, see 
<http://www.gnu.org/licenses/>.  */
    support features beyond those in `Fformat', which is used by `error' on the
    Lisp level.  */
 
-/* This function supports the following %-sequences in the `format'
-   argument:
+/* In the FORMAT argument this function supports ` and ' as directives
+   that output left and right quotes as per ‘text-quoting style’.  It
+   also supports the following %-sequences:
 
    %s means print a string argument.
    %S is silently treated as %s, for loose compatibility with `Fformat'.
@@ -144,6 +145,7 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format,
   /* Buffer we have got with malloc.  */
   char *big_buffer = NULL;
 
+  enum text_quoting_style quoting_style = text_quoting_style ();
   ptrdiff_t tem = -1;
   char *string;
   char fixed_buffer[20];       /* Default buffer for small formatting. */
@@ -164,7 +166,9 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format,
   /* Loop until end of format string or buffer full. */
   while (fmt < format_end && bufsize > 0)
     {
-      if (*fmt == '%') /* Check for a '%' character */
+      char const *fmt0 = fmt;
+      char fmtchar = *fmt++;
+      if (fmtchar == '%')
        {
          ptrdiff_t size_bound = 0;
          ptrdiff_t width;  /* Columns occupied by STRING on display.  */
@@ -180,7 +184,6 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format,
          int maxmlen = max (max (1, pDlen), max (pIlen, pMlen));
          int mlen;
 
-         fmt++;
          /* Copy this one %-spec into fmtcpy.  */
          string = fmtcpy;
          *string++ = '%';
@@ -438,22 +441,36 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char 
*format,
            }
        }
 
-      {
-       /* Just some character; Copy it if the whole multi-byte form
-          fit in the buffer.  */
-       char *save_bufptr = bufptr;
-
-       do { *bufptr++ = *fmt++; }
-       while (fmt < format_end && --bufsize > 0 && !CHAR_HEAD_P (*fmt));
-       if (!CHAR_HEAD_P (*fmt))
-         {
-           /* Truncate, but return value that will signal to caller
-              that the buffer was too small.  */
-           *save_bufptr = 0;
-           break;
-         }
-      }
-    };
+      char const *src;
+      ptrdiff_t srclen;
+      if (quoting_style == CURVE_QUOTING_STYLE && fmtchar == '`')
+       src = uLSQM, srclen = sizeof uLSQM - 1;
+      else if (quoting_style == CURVE_QUOTING_STYLE && fmtchar == '\'')
+       src = uRSQM, srclen = sizeof uRSQM - 1;
+      else if (quoting_style == STRAIGHT_QUOTING_STYLE && fmtchar == '`')
+       src = "'", srclen = 1;
+      else
+       {
+         while (fmt < format_end && !CHAR_HEAD_P (*fmt))
+           fmt++;
+         src = fmt0, srclen = fmt - fmt0;
+       }
+
+      if (bufsize < srclen)
+       {
+         /* Truncate, but return value that will signal to caller
+            that the buffer was too small.  */
+         do
+           *bufptr++ = '\0';
+         while (--bufsize != 0);
+       }
+      else
+       {
+         do
+           *bufptr++ = *src++;
+         while (--srclen != 0);
+       }
+    }
 
   /* If we had to malloc something, free it.  */
   xfree (big_buffer);
@@ -467,7 +484,8 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format,
 /* Format to an unbounded buffer BUF.  This is like sprintf, except it
    is not limited to returning an 'int' so it doesn't have a silly 2
    GiB limit on typical 64-bit hosts.  However, it is limited to the
-   Emacs-style formats that doprnt supports.
+   Emacs-style formats that doprnt supports, and it requotes ` and '
+   as per ‘text-quoting-style’.
 
    Return the number of bytes put into BUF, excluding the terminating
    '\0'.  */
diff --git a/src/xdisp.c b/src/xdisp.c
index 52c77bd..6d747eb 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -10275,9 +10275,9 @@ message_with_string (const char *m, Lisp_Object string, 
bool log)
 /* Dump an informative message to the minibuf.  If M is 0, clear out
    any existing message, and let the mini-buffer text show through.
 
-   The message must be safe ASCII only.  If strings may contain escape
-   sequences or non-ASCII characters, convert them to Lisp strings and
-   use Fmessage.  */
+   The message must be safe ASCII and the format must not contain ` or
+   '.  If your message and format do not fit into this category,
+   convert your arguments to Lisp objects and use Fmessage instead.  */
 
 static void ATTRIBUTE_FORMAT_PRINTF (1, 0)
 vmessage (const char *m, va_list ap)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]