{
/* `args' will contain the array of arguments to pass to the function.
`visargs' will contain the same list but in a nicer form, so that if we
- pass it to `Fformat_message' it will be understandable to a human. */
+ pass it to styled_format it will be understandable to a human. */
Lisp_Object *args, *visargs;
Lisp_Object specs;
Lisp_Object filter_specs;
for (i = 2; *tem; i++)
{
visargs[1] = make_string (tem + 1, strcspn (tem + 1, "\n"));
- if (strchr (SSDATA (visargs[1]), '%'))
- callint_message = Fformat_message (i - 1, visargs + 1);
- else
- callint_message = visargs[1];
+ callint_message = styled_format (i - 1, visargs + 1, true, false);
switch (*tem)
{
static long int tm_gmtoff (struct tm *);
static int tm_diff (struct tm *, struct tm *);
static void update_buffer_properties (ptrdiff_t, ptrdiff_t);
-static Lisp_Object styled_format (ptrdiff_t, Lisp_Object *, bool);
#ifndef HAVE_TM_GMTOFF
# define HAVE_TM_GMTOFF false
}
else
{
- Lisp_Object val = Fformat_message (nargs, args);
+ Lisp_Object val = styled_format (nargs, args, true, false);
message3 (val);
return val;
}
}
else
{
- Lisp_Object val = Fformat_message (nargs, args);
+ Lisp_Object val = styled_format (nargs, args, true, false);
Lisp_Object pane, menu;
pane = list1 (Fcons (build_string ("OK"), Qt));
usage: (format STRING &rest OBJECTS) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
- return styled_format (nargs, args, false);
+ return styled_format (nargs, args, false, true);
}
DEFUN ("format-message", Fformat_message, Sformat_message, 1, MANY, 0,
usage: (format-message STRING &rest OBJECTS) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
- return styled_format (nargs, args, true);
+ return styled_format (nargs, args, true, true);
}
-/* Implement ‘format-message’ if MESSAGE is true, ‘format’ otherwise. */
+/* Implement ‘format-message’ if MESSAGE is true, ‘format’ otherwise.
+ If NEW_RESULT, the result is a new string; otherwise, the result
+ may be one of the arguments. */
-static Lisp_Object
-styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message)
+Lisp_Object
+styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message,
+ bool new_result)
{
ptrdiff_t n; /* The number of the next arg to substitute. */
char initial_buffer[4000];
/* The start and end bytepos in the output string. */
ptrdiff_t start, end;
+ /* Whether the argument is a newly created string. */
+ bool_bf new_string : 1;
+
/* Whether the argument is a string with intervals. */
bool_bf intervals : 1;
} *info;
memset (&discarded[format0 - format_start], 1,
format - format0 - (conversion == '%'));
if (conversion == '%')
- goto copy_char;
+ {
+ new_result = true;
+ goto copy_char;
+ }
++n;
if (! (n < nargs))
if (nspec < ispec)
{
spec->argument = args[n];
+ spec->new_string = false;
spec->intervals = false;
nspec = ispec;
}
{
Lisp_Object noescape = conversion == 'S' ? Qnil : Qt;
spec->argument = arg = Fprin1_to_string (arg, noescape);
+ spec->new_string = true;
if (STRING_MULTIBYTE (arg) && ! multibyte)
{
multibyte = true;
goto retry;
}
+ new_result = false;
}
conversion = 's';
}
goto retry;
}
spec->argument = arg = Fchar_to_string (arg);
+ spec->new_string = true;
}
if (!EQ (arg, args[n]))
if (conversion == 's')
{
+ if (format == end && format - format_start == 2
+ && (!new_result || spec->new_string)
+ && ! string_intervals (args[0]))
+ return arg;
+
/* handle case (precision[n] >= 0) */
ptrdiff_t prec = -1;
if (string_intervals (arg))
spec->intervals = arg_intervals = true;
+ new_result = true;
continue;
}
}
}
spec->end = nchars;
+ new_result = true;
continue;
}
}
}
convsrc = format_char == '`' ? uLSQM : uRSQM;
convbytes = 3;
+ new_result = true;
}
else if (format_char == '`' && quoting_style == STRAIGHT_QUOTING_STYLE)
- convsrc = "'";
+ {
+ convsrc = "'";
+ new_result = true;
+ }
else
{
/* Copy a single character from format to buf. */
int c = BYTE8_TO_CHAR (format_char);
convbytes = CHAR_STRING (c, str);
convsrc = (char *) str;
+ new_result = true;
}
}
if (bufsize < p - buf)
emacs_abort ();
+ if (! new_result)
+ return args[0];
+
if (maybe_combine_byte)
nchars = multibyte_chars_in_text ((unsigned char *) buf, p - buf);
Lisp_Object val = make_specified_string (buf, nchars, p - buf, multibyte);
for (ptrdiff_t i = 1; i <= nargs; i++)
args[i] = va_arg (ap, Lisp_Object);
Lisp_Object msg = Qnil;
- msg = Fformat_message (nargs, args);
+ msg = styled_format (nargs, args, true, false);
ptrdiff_t len = SBYTES (msg) + 1;
USE_SAFE_ALLOCA;
usage: (trace-to-stderr STRING &rest OBJECTS) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
- Lisp_Object s = Fformat (nargs, args);
+ Lisp_Object s = styled_format (nargs, args, false, false);
fwrite (SDATA (s), 1, SBYTES (s), stderr);
return Qnil;
}