X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/1dc4aa6d975c9f92cd5c0d0baf5eae89e013fd67..0dc8cf5002ba3f79bf840de5b83c0f4f2e4e6279:/src/doprnt.c diff --git a/src/doprnt.c b/src/doprnt.c index 638fa4d631..44dc641d5d 100644 --- a/src/doprnt.c +++ b/src/doprnt.c @@ -1,7 +1,7 @@ /* Output like sprintf to a buffer of specified size. Also takes args differently: pass one pointer to the end of the format string in addition to the format string itself. - Copyright (C) 1985, 2001-2011 Free Software Foundation, Inc. + Copyright (C) 1985, 2001-2012 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -26,7 +26,7 @@ along with GNU Emacs. If not, see . */ of the (`int') argument, suitable for display in an Emacs buffer. . For %s and %c, when field width is specified (e.g., %25s), it accounts for - the diplay width of each character, according to char-width-table. That + the display width of each character, according to char-width-table. That is, it does not assume that each character takes one column on display. . If the size of the buffer is not enough to produce the formatted string in @@ -135,8 +135,8 @@ ptrdiff_t doprnt (char *buffer, ptrdiff_t bufsize, const char *format, const char *format_end, va_list ap) { - const char *fmt = format; /* Pointer into format string */ - register char *bufptr = buffer; /* Pointer into output buffer.. */ + const char *fmt = format; /* Pointer into format string. */ + char *bufptr = buffer; /* Pointer into output buffer. */ /* Use this for sprintf unless we need something really big. */ char tembuf[DBL_MAX_10_EXP + 100]; @@ -150,7 +150,7 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, /* Buffer we have got with malloc. */ char *big_buffer = NULL; - register size_t tem; + ptrdiff_t tem = -1; char *string; char fixed_buffer[20]; /* Default buffer for small formatting. */ char *fmtcpy; @@ -174,7 +174,7 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, if (*fmt == '%') /* Check for a '%' character */ { ptrdiff_t size_bound = 0; - EMACS_INT width; /* Columns occupied by STRING on display. */ + ptrdiff_t width; /* Columns occupied by STRING on display. */ enum { pDlen = sizeof pD - 1, pIlen = sizeof pI - 1, @@ -257,7 +257,7 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, { if (big_buffer) xfree (big_buffer); - big_buffer = (char *) xmalloc (size_bound); + big_buffer = xmalloc (size_bound); sprintf_buffer = big_buffer; size_allocated = size_bound; } @@ -275,32 +275,32 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, case no_modifier: { int v = va_arg (ap, int); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; case long_modifier: { long v = va_arg (ap, long); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; case pD_modifier: signed_pD_modifier: { ptrdiff_t v = va_arg (ap, ptrdiff_t); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; case pI_modifier: { EMACS_INT v = va_arg (ap, EMACS_INT); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; case pM_modifier: { intmax_t v = va_arg (ap, intmax_t); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; } @@ -315,13 +315,13 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, case no_modifier: { unsigned v = va_arg (ap, unsigned); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; case long_modifier: { unsigned long v = va_arg (ap, unsigned long); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; case pD_modifier: @@ -329,13 +329,13 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, case pI_modifier: { EMACS_UINT v = va_arg (ap, EMACS_UINT); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; case pM_modifier: { uintmax_t v = va_arg (ap, uintmax_t); - sprintf (sprintf_buffer, fmtcpy, v); + tem = sprintf (sprintf_buffer, fmtcpy, v); } break; } @@ -347,8 +347,8 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, case 'e': case 'g': { - double d = va_arg(ap, double); - sprintf (sprintf_buffer, fmtcpy, d); + double d = va_arg (ap, double); + tem = sprintf (sprintf_buffer, fmtcpy, d); /* Now copy into final output, truncating as necessary. */ string = sprintf_buffer; goto doit; @@ -368,8 +368,8 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, /* Copy string into final output, truncating if no room. */ doit: + eassert (0 <= tem); /* Coming here means STRING contains ASCII only. */ - tem = strlen (string); if (STRING_BYTES_BOUND < tem) error ("Format width or precision too large"); width = tem; @@ -392,15 +392,19 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, { /* Truncate the string at character boundary. */ tem = bufsize; - while (!CHAR_HEAD_P (string[tem - 1])) tem--; - /* If the multibyte sequence of this character is - too long for the space we have left in the - buffer, truncate before it. */ - if (tem > 0 - && BYTES_BY_CHAR_HEAD (string[tem - 1]) > bufsize) - tem--; - if (tem > 0) - memcpy (bufptr, string, tem); + do + { + tem--; + if (CHAR_HEAD_P (string[tem])) + { + if (BYTES_BY_CHAR_HEAD (string[tem]) <= bufsize - tem) + tem = bufsize; + break; + } + } + while (tem != 0); + + memcpy (bufptr, string, tem); bufptr[tem] = 0; /* Trigger exit from the loop, but make sure we return to the caller a value which will indicate @@ -409,8 +413,7 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, bufsize = 0; continue; } - else - memcpy (bufptr, string, tem); + memcpy (bufptr, string, tem); bufptr += tem; bufsize -= tem; if (minlen < 0) @@ -427,7 +430,7 @@ doprnt (char *buffer, ptrdiff_t bufsize, const char *format, case 'c': { - int chr = va_arg(ap, int); + int chr = va_arg (ap, int); tem = CHAR_STRING (chr, (unsigned char *) charbuf); string = charbuf; string[tem] = 0; @@ -486,6 +489,8 @@ esprintf (char *buf, char const *format, ...) return nbytes; } +#if defined HAVE_X_WINDOWS && defined USE_X_TOOLKIT + /* Format to buffer *BUF of positive size *BUFSIZE, reallocating *BUF and updating *BUFSIZE if the buffer is too small, and otherwise behaving line esprintf. When reallocating, free *BUF unless it is @@ -505,6 +510,8 @@ exprintf (char **buf, ptrdiff_t *bufsize, return nbytes; } +#endif + /* Act like exprintf, except take a va_list. */ ptrdiff_t evxprintf (char **buf, ptrdiff_t *bufsize,