[BACK]Return to cmd-capture-pane.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Diff for /src/usr.bin/tmux/cmd-capture-pane.c between version 1.3 and 1.4

version 1.3, 2010/01/20 18:30:20 version 1.4, 2010/12/30 23:16:18
Line 18 
Line 18 
   
 #include <sys/types.h>  #include <sys/types.h>
   
   #include <stdlib.h>
 #include <string.h>  #include <string.h>
   
 #include "tmux.h"  #include "tmux.h"
Line 26 
Line 27 
  * Write the entire contents of a pane to a buffer.   * Write the entire contents of a pane to a buffer.
  */   */
   
   int     cmd_capture_pane_parse(struct cmd *, int, char **, char **);
 int     cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *);  int     cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *);
   void    cmd_capture_pane_free(struct cmd *);
   void    cmd_capture_pane_init(struct cmd *, int);
   size_t  cmd_capture_pane_print(struct cmd *, char *, size_t);
   
   struct cmd_capture_pane_data {
           char    *target;
           int      buffer;
   };
   
 const struct cmd_entry cmd_capture_pane_entry = {  const struct cmd_entry cmd_capture_pane_entry = {
         "capture-pane", "capturep",          "capture-pane", "capturep",
         CMD_BUFFER_PANE_USAGE,          CMD_BUFFER_PANE_USAGE,
         0, "",          0, "",
         cmd_buffer_init,          cmd_capture_pane_init,
         cmd_buffer_parse,          cmd_capture_pane_parse,
         cmd_capture_pane_exec,          cmd_capture_pane_exec,
         cmd_buffer_free,          cmd_capture_pane_free,
         cmd_buffer_print          cmd_capture_pane_print
 };  };
   
   /* ARGSUSED */
   void
   cmd_capture_pane_init(struct cmd *self, unused int arg)
   {
           struct cmd_capture_pane_data    *data;
   
           self->data = data = xmalloc(sizeof *data);
           data->buffer = -1;
           data->target = NULL;
   }
   
 int  int
   cmd_capture_pane_parse(struct cmd *self, int argc, char **argv, char **cause)
   {
           struct cmd_capture_pane_data    *data;
           const char                      *errstr;
           int                              n, opt;
   
           self->entry->init(self, KEYC_NONE);
           data = self->data;
   
           while ((opt = getopt(argc, argv, "b:t:")) != -1) {
                   switch (opt) {
                   case 'b':
                           if (data->buffer == -1) {
                                   n = strtonum(optarg, 0, INT_MAX, &errstr);
                                   if (errstr != NULL) {
                                           xasprintf(cause, "buffer %s", errstr);
                                           goto error;
                                   }
                                   data->buffer = n;
                           }
                           break;
                   case 't':
                           if (data->target == NULL)
                                   data->target = xstrdup(optarg);
                           break;
                   default:
                           goto usage;
                   }
           }
           argc -= optind;
           argv += optind;
   
           return (0);
   
   usage:
           xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
   
   error:
           self->entry->free(self);
           return (-1);
   }
   
   int
 cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)  cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 {  {
         struct cmd_buffer_data  *data = self->data;          struct cmd_capture_pane_data    *data = self->data;
         struct window_pane      *wp;          struct window_pane              *wp;
         char                    *buf, *line;          char                            *buf, *line;
         struct screen           *s;          struct screen                   *s;
         struct session          *sess;          u_int                            i, limit;
         u_int                    i, limit;          size_t                           len, linelen;
         size_t                   len, linelen;  
   
         if (cmd_find_pane(ctx, data->target, &sess, &wp) == NULL)          if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL)
                 return (-1);                  return (-1);
         s = &wp->base;          s = &wp->base;
   
Line 69 
Line 132 
                xfree(line);                 xfree(line);
         }          }
   
         limit = options_get_number(&sess->options, "buffer-limit");          limit = options_get_number(&global_options, "buffer-limit");
         if (data->buffer == -1) {          if (data->buffer == -1) {
                 paste_add(&sess->buffers, buf, len, limit);                  paste_add(&global_buffers, buf, len, limit);
                 return (0);                  return (0);
         }          }
         if (paste_replace(&sess->buffers, data->buffer, buf, len) != 0) {          if (paste_replace(&global_buffers, data->buffer, buf, len) != 0) {
                 ctx->error(ctx, "no buffer %d", data->buffer);                  ctx->error(ctx, "no buffer %d", data->buffer);
                 xfree(buf);                  xfree(buf);
                 return (-1);                  return (-1);
         }          }
         return (0);          return (0);
   }
   
   void
   cmd_capture_pane_free(struct cmd *self)
   {
           struct cmd_capture_pane_data    *data = self->data;
   
           if (data->target != NULL)
                   xfree(data->target);
           xfree(data);
   }
   
   size_t
   cmd_capture_pane_print(struct cmd *self, char *buf, size_t len)
   {
           struct cmd_capture_pane_data    *data = self->data;
           size_t                           off = 0;
   
           off += xsnprintf(buf, len, "%s", self->entry->name);
           if (data == NULL)
                   return (off);
           if (off < len && data->buffer != -1)
                   off += xsnprintf(buf + off, len - off, " -b %d", data->buffer);
           if (off < len && data->target != NULL)
                   off += xsnprintf(buf + off, len - off, " -t %s", data->target);
           return (off);
 }  }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4