From a8290ec31c89dfdec85fc9d46000c66c0caa1697 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Mon, 9 Jul 2012 16:02:27 +0400 Subject: [PATCH] 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. --- src/ChangeLog | 18 ++++++++++++++++++ src/alloc.c | 14 ++++++++++++++ src/buffer.c | 9 +++++---- src/dbusbind.c | 4 ++-- src/editfns.c | 5 +++-- src/filelock.c | 8 ++++---- src/frame.c | 18 +++++------------- src/image.c | 8 ++++---- src/lisp.h | 1 + src/minibuf.c | 4 ++-- src/msdos.c | 6 ++++-- src/process.c | 3 +-- src/xdisp.c | 4 ++-- src/xsettings.c | 10 ++++++---- 14 files changed, 71 insertions(+), 41 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 1aa5f7df5c..4e69496fad 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,21 @@ +2012-07-09 Dmitry Antipov + + 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 Stop ns builds polluting the environment with EMACSDATA, EMACSDOC. diff --git a/src/alloc.c b/src/alloc.c index 88f96c41a1..739ec40c45 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 a40270c945..28cede3916 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 d80bb21cd5..203a25c151 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, µ); - 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 fe119490f3..f6d849fbc7 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 252ee3cfb1..30258a5ffa 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 4902811ecf..be5631da77 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 0854d01716..b4ad329bac 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 ca199190bc..466287b798 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 89390aeb0b..acf57a7326 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 64fc671fa4..8a6a150a95 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 f7ecd9b05a..7e9d746a45 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 9018dce37f..4b9445d746 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 a4e3849a65..6f7b81cbe8 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); -- 2.20.1