version 1.3, 2009/07/26 12:58:44 |
version 1.4, 2009/08/18 12:26:37 |
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
#include <string.h> |
#include <string.h> |
|
#include <vis.h> |
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
|
|
struct session *s; |
struct session *s; |
struct paste_buffer *pb; |
struct paste_buffer *pb; |
u_int idx; |
u_int idx; |
char *tmp; |
char tmp[51 * 4 + 1]; |
size_t size, in, out; |
size_t size, len; |
|
|
if ((s = cmd_find_session(ctx, data->target)) == NULL) |
if ((s = cmd_find_session(ctx, data->target)) == NULL) |
return (-1); |
return (-1); |
|
|
if (s->sx > 35) { /* leave three for ... */ |
|
size = s->sx - 32; |
|
tmp = xmalloc(size + 1); |
|
} else { |
|
size = 0; |
|
tmp = NULL; |
|
} |
|
|
|
idx = 0; |
idx = 0; |
while ((pb = paste_walk_stack(&s->buffers, &idx)) != NULL) { |
while ((pb = paste_walk_stack(&s->buffers, &idx)) != NULL) { |
if (tmp != NULL) { |
size = strlen(pb->data); |
in = out = 0; |
|
while (out < size && pb->data[in] != '\0') { |
|
if (pb->data[in] > 31 && pb->data[in] != 127) |
|
tmp[out++] = pb->data[in]; |
|
in++; |
|
} |
|
tmp[out] = '\0'; |
|
if (out == size) { |
|
tmp[out - 1] = '.'; |
|
tmp[out - 2] = '.'; |
|
tmp[out - 3] = '.'; |
|
} |
|
|
|
ctx->print(ctx, "%d: %zu bytes: \"%s\"", |
/* Translate the first 50 characters. */ |
idx - 1, strlen(pb->data), tmp); |
len = size; |
} else |
if (len > 50) |
ctx->print(ctx, "%d: %zu bytes", idx, strlen(pb->data)); |
len = 50; |
} |
strvisx(tmp, pb->data, len, VIS_OCTAL|VIS_TAB|VIS_NL); |
|
|
if (tmp != NULL) |
/* |
xfree(tmp); |
* If the first 50 characterswere encoded as a longer string, |
|
* or there is definitely more data, add "...". |
|
*/ |
|
if (size > 50 || strlen(tmp) > 50) { |
|
tmp[50 - 3] = '\0'; |
|
strlcat(tmp, "...", sizeof tmp); |
|
} |
|
|
|
ctx->print(ctx, "%u: %zu bytes: \"%s\"", idx - 1, size, tmp); |
|
} |
|
|
return (0); |
return (0); |
} |
} |