summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog18
-rw-r--r--src/alloc.c14
-rw-r--r--src/buffer.c9
-rw-r--r--src/dbusbind.c4
-rw-r--r--src/editfns.c5
-rw-r--r--src/filelock.c8
-rw-r--r--src/frame.c18
-rw-r--r--src/image.c8
-rw-r--r--src/lisp.h1
-rw-r--r--src/minibuf.c4
-rw-r--r--src/msdos.c6
-rw-r--r--src/process.c3
-rw-r--r--src/xdisp.c4
-rw-r--r--src/xsettings.c10
14 files changed, 71 insertions, 41 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 1aa5f7df5c3..4e69496fadd 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,21 @@
+2012-07-09 Dmitry Antipov <dmantipov@yandex.ru>
+
+ Use make_formatted_string to avoid double length calculation.
+ * lisp.h (make_formatted_string): New prototype.
+ * alloc.c (make_formatted_string): New function.
+ * buffer.c (Fgenerate_new_buffer_name): Use it.
+ * dbus.c (syms_of_dbusbind): Likewise.
+ * editfns.c (Fcurrent_time_zone): Likewise.
+ * filelock.c (get_boot_time): Likewise.
+ * frame.c (make_terminal_frame, set_term_frame_name)
+ (x_report_frame_params): Likewise.
+ * image.c (gs_load): Likewise.
+ * minibuf.c (get_minibuffer): Likewise.
+ * msdos.c (dos_set_window_size): Likewise.
+ * process.c (make_process): Likewise.
+ * xdisp.c (ensure_echo_area_buffers): Likewise.
+ * xsettings.c (apply_xft_settings): Likewise.
+
2012-07-09 Glenn Morris <rgm@gnu.org>
Stop ns builds polluting the environment with EMACSDATA, EMACSDOC.
diff --git a/src/alloc.c b/src/alloc.c
index 88f96c41a15..739ec40c45c 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -2517,6 +2517,20 @@ make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
return string;
}
+/* Print arguments to BUF according to a FORMAT, then return
+ a Lisp_String initialized with the data from BUF. */
+
+Lisp_Object
+make_formatted_string (char *buf, const char *format, ...)
+{
+ va_list ap;
+ ptrdiff_t length;
+
+ va_start (ap, format);
+ length = vsprintf (buf, format, ap);
+ va_end (ap);
+ return make_string (buf, length);
+}
/***********************************************************************
diff --git a/src/buffer.c b/src/buffer.c
index a40270c945c..28cede3916c 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -861,8 +861,9 @@ is first appended to NAME, to speed up finding a non-existent buffer. */)
if (!strncmp (SSDATA (name), " ", 1)) /* see bug#1229 */
{
/* Note fileio.c:make_temp_name does random differently. */
- sprintf (number, "-%"pI"d", XFASTINT (Frandom (make_number (999999))));
- tem2 = concat2 (name, build_string (number));
+ tem2 = concat2 (name, make_formatted_string
+ (number, "-%"pI"d",
+ XFASTINT (Frandom (make_number (999999)))));
tem = Fget_buffer (tem2);
if (NILP (tem))
return tem2;
@@ -873,8 +874,8 @@ is first appended to NAME, to speed up finding a non-existent buffer. */)
count = 1;
while (1)
{
- sprintf (number, "<%"pD"d>", ++count);
- gentemp = concat2 (tem2, build_string (number));
+ gentemp = concat2 (tem2, make_formatted_string
+ (number, "<%"pD"d>", ++count));
tem = Fstring_equal (gentemp, ignore);
if (!NILP (tem))
return gentemp;
diff --git a/src/dbusbind.c b/src/dbusbind.c
index d80bb21cd59..203a25c151a 100644
--- a/src/dbusbind.c
+++ b/src/dbusbind.c
@@ -1757,8 +1757,8 @@ syms_of_dbusbind (void)
int major, minor, micro;
char s[sizeof ".." + 3 * INT_STRLEN_BOUND (int)];
dbus_get_version (&major, &minor, &micro);
- sprintf (s, "%d.%d.%d", major, minor, micro);
- Vdbus_runtime_version = build_string (s);
+ Vdbus_runtime_version
+ = make_formatted_string (s, "%d.%d.%d", major, minor, micro);
#else
Vdbus_runtime_version = Qnil;
#endif
diff --git a/src/editfns.c b/src/editfns.c
index fe119490f3f..f6d849fbc7a 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -2082,8 +2082,9 @@ the data it can't find. */)
int m = offset / 60;
int am = offset < 0 ? - m : m;
char buf[sizeof "+00" + INT_STRLEN_BOUND (int)];
- sprintf (buf, "%c%02d%02d", (offset < 0 ? '-' : '+'), am/60, am%60);
- zone_name = build_string (buf);
+ zone_name = make_formatted_string (buf, "%c%02d%02d",
+ (offset < 0 ? '-' : '+'),
+ am / 60, am % 60);
}
}
diff --git a/src/filelock.c b/src/filelock.c
index 252ee3cfb1d..30258a5ffa0 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -174,14 +174,14 @@ get_boot_time (void)
filename = Qnil;
- sprintf (cmd_string, "%s.%d", WTMP_FILE, counter);
- tempname = build_string (cmd_string);
+ tempname = make_formatted_string
+ (cmd_string, "%s.%d", WTMP_FILE, counter);
if (! NILP (Ffile_exists_p (tempname)))
filename = tempname;
else
{
- sprintf (cmd_string, "%s.%d.gz", WTMP_FILE, counter);
- tempname = build_string (cmd_string);
+ tempname = make_formatted_string (cmd_string, "%s.%d.gz",
+ WTMP_FILE, counter);
if (! NILP (Ffile_exists_p (tempname)))
{
Lisp_Object args[6];
diff --git a/src/frame.c b/src/frame.c
index 4902811ecff..be5631da773 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -518,9 +518,7 @@ make_terminal_frame (struct terminal *terminal)
XSETFRAME (frame, f);
Vframe_list = Fcons (frame, Vframe_list);
- tty_frame_count++;
- sprintf (name, "F%"pMd, tty_frame_count);
- f->name = build_string (name);
+ f->name = make_formatted_string (name, "F%"pMd, ++tty_frame_count);
f->visible = 1; /* FRAME_SET_VISIBLE wd set frame_garbaged. */
f->async_visible = 1; /* Don't let visible be cleared later. */
@@ -2028,9 +2026,7 @@ set_term_frame_name (struct frame *f, Lisp_Object name)
SBYTES (f->name)))
return;
- tty_frame_count++;
- sprintf (namebuf, "F%"pMd, tty_frame_count);
- name = build_string (namebuf);
+ name = make_formatted_string (namebuf, "F%"pMd, ++tty_frame_count);
}
else
{
@@ -3049,20 +3045,16 @@ x_report_frame_params (struct frame *f, Lisp_Object *alistptr)
actually a pointer. Explicit casting avoids compiler
warnings. */
w = (unsigned long) FRAME_X_WINDOW (f);
- sprintf (buf, "%lu", w);
store_in_alist (alistptr, Qwindow_id,
- build_string (buf));
+ make_formatted_string (buf, "%lu", w));
#ifdef HAVE_X_WINDOWS
#ifdef USE_X_TOOLKIT
/* Tooltip frame may not have this widget. */
if (FRAME_X_OUTPUT (f)->widget)
#endif
- {
- w = (unsigned long) FRAME_OUTER_WINDOW (f);
- sprintf (buf, "%lu", w);
- }
+ w = (unsigned long) FRAME_OUTER_WINDOW (f);
store_in_alist (alistptr, Qouter_window_id,
- build_string (buf));
+ make_formatted_string (buf, "%lu", w));
#endif
store_in_alist (alistptr, Qicon_name, f->icon_name);
FRAME_SAMPLE_VISIBILITY (f);
diff --git a/src/image.c b/src/image.c
index 0854d017163..b4ad329bacb 100644
--- a/src/image.c
+++ b/src/image.c
@@ -8549,13 +8549,13 @@ gs_load (struct frame *f, struct image *img)
don't either. Let the Lisp loader use `unwind-protect' instead. */
printnum1 = FRAME_X_WINDOW (f);
printnum2 = img->pixmap;
- sprintf (buffer, "%"pMu" %"pMu, printnum1, printnum2);
- window_and_pixmap_id = build_string (buffer);
+ window_and_pixmap_id
+ = make_formatted_string (buffer, "%"pMu" %"pMu, printnum1, printnum2);
printnum1 = FRAME_FOREGROUND_PIXEL (f);
printnum2 = FRAME_BACKGROUND_PIXEL (f);
- sprintf (buffer, "%"pMu" %"pMu, printnum1, printnum2);
- pixel_colors = build_string (buffer);
+ pixel_colors
+ = make_formatted_string (buffer, "%"pMu" %"pMu, printnum1, printnum2);
XSETFRAME (frame, f);
loader = image_spec_value (img->spec, QCloader, NULL);
diff --git a/src/lisp.h b/src/lisp.h
index ca199190bc0..466287b798a 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -2611,6 +2611,7 @@ extern Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
extern Lisp_Object allocate_misc (void);
extern _Noreturn void string_overflow (void);
extern Lisp_Object make_string (const char *, ptrdiff_t);
+extern Lisp_Object make_formatted_string (char *, const char *, ...);
extern Lisp_Object make_unibyte_string (const char *, ptrdiff_t);
extern Lisp_Object make_multibyte_string (const char *, ptrdiff_t, ptrdiff_t);
extern Lisp_Object make_event_array (int, Lisp_Object *);
diff --git a/src/minibuf.c b/src/minibuf.c
index 89390aeb0b5..acf57a73268 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -792,8 +792,8 @@ get_minibuffer (EMACS_INT depth)
buf = Fcar (tail);
if (NILP (buf) || NILP (BVAR (XBUFFER (buf), name)))
{
- sprintf (name, " *Minibuf-%"pI"d*", depth);
- buf = Fget_buffer_create (build_string (name));
+ buf = Fget_buffer_create
+ (make_formatted_string (name, " *Minibuf-%"pI"d*", depth));
/* Although the buffer's name starts with a space, undo should be
enabled in it. */
diff --git a/src/msdos.c b/src/msdos.c
index 64fc671fa43..8a6a150a956 100644
--- a/src/msdos.c
+++ b/src/msdos.c
@@ -520,8 +520,10 @@ dos_set_window_size (int *rows, int *cols)
/* If the user specified a special video mode for these dimensions,
use that mode. */
- sprintf (video_name, "screen-dimensions-%dx%d", *rows, *cols);
- video_mode = Fsymbol_value (Fintern_soft (build_string (video_name), Qnil));
+ video_mode
+ = Fsymbol_value (Fintern_soft (make_formatted_string
+ (video_name, "screen-dimensions-%dx%d",
+ *rows, *cols), Qnil));
if (INTEGERP (video_mode)
&& (video_mode_value = XINT (video_mode)) > 0)
diff --git a/src/process.c b/src/process.c
index f7ecd9b05a7..7e9d746a450 100644
--- a/src/process.c
+++ b/src/process.c
@@ -645,8 +645,7 @@ make_process (Lisp_Object name)
{
tem = Fget_process (name1);
if (NILP (tem)) break;
- sprintf (suffix, "<%"pMd">", i);
- name1 = concat2 (name, build_string (suffix));
+ name1 = concat2 (name, make_formatted_string (suffix, "<%"pMd">", i));
}
name = name1;
p->name = name;
diff --git a/src/xdisp.c b/src/xdisp.c
index 9018dce37fa..4b9445d7469 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -9866,8 +9866,8 @@ ensure_echo_area_buffers (void)
int j;
old_buffer = echo_buffer[i];
- sprintf (name, " *Echo Area %d*", i);
- echo_buffer[i] = Fget_buffer_create (build_string (name));
+ echo_buffer[i] = Fget_buffer_create
+ (make_formatted_string (name, " *Echo Area %d*", i));
BVAR (XBUFFER (echo_buffer[i]), truncate_lines) = Qnil;
/* to force word wrap in echo area -
it was decided to postpone this*/
diff --git a/src/xsettings.c b/src/xsettings.c
index a4e3849a652..6f7b81cbe87 100644
--- a/src/xsettings.c
+++ b/src/xsettings.c
@@ -711,10 +711,12 @@ apply_xft_settings (struct x_display_info *dpyinfo,
if (send_event_p)
store_config_changed_event (Qfont_render,
XCAR (dpyinfo->name_list_element));
- sprintf (buf, format, oldsettings.aa, oldsettings.hinting,
- oldsettings.rgba, oldsettings.lcdfilter,
- oldsettings.hintstyle, oldsettings.dpi);
- Vxft_settings = build_string (buf);
+ Vxft_settings
+ = make_formatted_string (buf, format,
+ oldsettings.aa, oldsettings.hinting,
+ oldsettings.rgba, oldsettings.lcdfilter,
+ oldsettings.hintstyle, oldsettings.dpi);
+
}
else
FcPatternDestroy (pat);