Hi,

Attached is a patch which cleans up memory in display-message when using
a format. It also puts the message back through status_replace for the
strftime expansion (reduce duplication of code and such).

In addition, status_replace has its own format_tree which expands
session and client information.

--Ben
diff --git a/cmd-display-message.c b/cmd-display-message.c
index 1b87e77..f8b69d0 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -49,8 +49,7 @@ cmd_display_message_exec(struct cmd *self, struct cmd_ctx 
*ctx)
        const char              *template;
        char                    *msg;
        struct format_tree      *ft;
-       char                     out[BUFSIZ];
-       time_t                   t;
+       char                    *line;
 
        if ((c = cmd_find_client(ctx, args_get(args, 'c'))) == NULL)
                return (-1);
@@ -77,19 +76,18 @@ cmd_display_message_exec(struct cmd *self, struct cmd_ctx 
*ctx)
                template = "[#S] #I:#W, current pane #P - (%H:%M %d-%b-%y)";
 
        ft = format_create();
-       format_client(ft, c);
-       format_session(ft, s);
        format_winlink(ft, s, wl);
        format_window_pane(ft, wp);
 
-       t = time(NULL);
-       strftime(out, sizeof out, template, localtime(&t));
+       line = format_expand(ft, template);
+       msg = status_replace(c, s, wl, wp, line, time(NULL), 0);
 
-       msg = format_expand(ft, out);
        if (args_has(self->args, 'p'))
                ctx->print(ctx, "%s", msg);
        else
                status_message_set(c, "%s", msg);
+       xfree(line);
+       format_free(ft);
        xfree(msg);
 
        return (0);
diff --git a/status.c b/status.c
index 4df6745..6d48fe8 100644
--- a/status.c
+++ b/status.c
@@ -503,9 +503,10 @@ char *
 status_replace(struct client *c, struct session *s, struct winlink *wl,
     struct window_pane *wp, const char *fmt, time_t t, int jobsflag)
 {
-       static char     out[BUFSIZ];
-       char            in[BUFSIZ], ch, *iptr, *optr;
-       size_t          len;
+       static char              out[BUFSIZ];
+       char                     in[BUFSIZ], ch, *iptr, *optr, *line;
+       size_t                   len;
+       struct format_tree      *ft;
 
        len = strftime(in, sizeof in, fmt, localtime(&t));
        in[len] = '\0';
@@ -527,7 +528,15 @@ status_replace(struct client *c, struct session *s, struct 
winlink *wl,
        }
        *optr = '\0';
 
-       return (xstrdup(out));
+       ft = format_create();
+       format_session(ft, s);
+       format_client(ft, c);
+
+       line = format_expand(ft, out);
+
+       format_free(ft);
+
+       return line;
 }
 
 /* Figure out job name and get its result, starting it off if necessary. */
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to