emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] /srv/bzr/emacs/trunk r104033: Merge: * doprnt.c (doprnt):


From: Paul Eggert
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r104033: Merge: * doprnt.c (doprnt): Support "ll" length modifier, for long long.
Date: Wed, 27 Apr 2011 16:48:43 -0700
User-agent: Bazaar (2.3.1)

------------------------------------------------------------
revno: 104033 [merge]
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Wed 2011-04-27 16:48:43 -0700
message:
  Merge: * doprnt.c (doprnt): Support "ll" length modifier, for long long.
modified:
  src/ChangeLog
  src/doc.c
  src/doprnt.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2011-04-27 23:35:33 +0000
+++ b/src/ChangeLog     2011-04-27 23:48:43 +0000
@@ -1,3 +1,7 @@
+2011-04-27  Paul Eggert  <address@hidden>
+
+       * doprnt.c (doprnt): Support "ll" length modifier, for long long.
+
 2011-04-27  Juanma Barranquero  <address@hidden>
 
        * makefile.w32-in: Update dependencies.

=== modified file 'src/doc.c'
--- a/src/doc.c 2011-04-26 06:17:52 +0000
+++ b/src/doc.c 2011-04-27 19:05:21 +0000
@@ -347,6 +347,8 @@
     {
       if (XSUBR (fun)->doc == 0)
        return Qnil;
+      /* FIXME: This is not portable, as it assumes that string
+        pointers have the top bit clear.  */
       else if ((EMACS_INT) XSUBR (fun)->doc >= 0)
        doc = build_string (XSUBR (fun)->doc);
       else

=== modified file 'src/doprnt.c'
--- a/src/doprnt.c      2011-04-27 18:15:29 +0000
+++ b/src/doprnt.c      2011-04-27 23:04:20 +0000
@@ -70,7 +70,7 @@
      %<flags><width><precision><length>character
 
    where flags is [+ -0], width is [0-9]+, precision is .[0-9]+, and length
-   modifier is l.
+   modifier is empty or l or ll.
 
    The + flag character inserts a + before any positive number, while a space
    inserts a space before any positive number; these flags only affect %d, %o,
@@ -81,9 +81,13 @@
 
    The l (lower-case letter ell) length modifier is a `long' data type
    modifier: it is supported for %d, %o, and %x conversions of integral
-   arguments, must immediately preced the conversion specifier, and means that
+   arguments, must immediately precede the conversion specifier, and means that
    the respective argument is to be treated as `long int' or `unsigned long
-   int'.  The EMACS_INT data type should use this modifier.
+   int'.  Similarly, ll (two letter ells) means to use `long long int' or
+   `unsigned long long int'; this can be used only on hosts that have
+   these two types.  The empty length modifier means to use `int' or
+   `unsigned int'.  EMACS_INT arguments should use the pI macro, which
+   expands to whatever length modifier is needed for the target host.
 
    The width specifier supplies a lower limit for the length of the printed
    representation.  The padding, if any, normally goes on the left, but it goes
@@ -208,8 +212,8 @@
                ;
              else if (*fmt == 'l')
                {
-                 long_flag = 1;
-                 fmt++;
+                 long_flag = 1 + (fmt + 1 < format_end && fmt[1] == 'l');
+                 fmt += long_flag;
                  break;
                }
              else
@@ -240,7 +244,7 @@
            {
            default:
              error ("Invalid format operation %%%s%c",
-                    long_flag ? "l" : "", fmt[-1]);
+                    "ll" + 2 - long_flag, fmt[-1]);
 
 /*         case 'b': */
            case 'l':
@@ -249,7 +253,16 @@
                int i;
                long l;
 
-               if (long_flag)
+               if (1 < long_flag)
+                 {
+#ifdef HAVE_LONG_LONG_INT
+                   long long ll = va_arg (ap, long long);
+                   sprintf (sprintf_buffer, fmtcpy, ll);
+#else
+                   abort ();
+#endif
+                 }
+               else if (long_flag)
                  {
                    l = va_arg(ap, long);
                    sprintf (sprintf_buffer, fmtcpy, l);
@@ -270,7 +283,16 @@
                unsigned u;
                unsigned long ul;
 
-               if (long_flag)
+               if (1 < long_flag)
+                 {
+#ifdef HAVE_UNSIGNED_LONG_LONG_INT
+                   unsigned long long ull = va_arg (ap, unsigned long long);
+                   sprintf (sprintf_buffer, fmtcpy, ull);
+#else
+                   abort ();
+#endif
+                 }
+               else if (long_flag)
                  {
                    ul = va_arg(ap, unsigned long);
                    sprintf (sprintf_buffer, fmtcpy, ul);


reply via email to

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