 |
/*
** $Id$
**
** xbuffer -- manipulates and views the contents of the X cut buffer
*/
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
int p, bufsize, i;
Display *display;
char *buffer, *tmp, *prog;
/** store the calling program name **/
if ((prog = strrchr(argv[0], '/')) == NULL) prog = argv[0];
else prog++;
/** try to open the display; fail quietly **/
if ((display = XOpenDisplay(NULL)) == NULL) exit(1);
/** if "-h", spit out the usage **/
if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'h') {
fprintf(stderr,
"usage: %s [ - | text to go in buffer ]\n"
" -: if only a '-' is supplied, contents of stdin are placed\n"
" in X cut buffer\n"
" text: if arguments are given, the X cut buffer is set to them\n"
" (spaces added, with a trailing newline)\n"
" no arg: if no arguments are given, the contents of the X cut\n"
" buffer are printed to stdout\n", prog);
}
/** if no arguments, dump out the buffer **/
if (argc == 1) {
printf("%s", XFetchBytes(display, &bufsize));
exit(0);
}
/** if just '-', read stdin **/
if (argc == 2 && argv[1][0] == '-' && argv[1][1] == '\0') {
bufsize = 32; p = 0;
buffer = (char*) malloc(bufsize);
while ((buffer[p++] = getchar()) != EOF) {
if (p == bufsize) {
bufsize *= 2;
buffer = (char*) realloc(buffer, bufsize);
}
}
XStoreBytes(display, buffer, p-1);
XFlush(display);
exit(0);
}
/** else, combined the arg list (ugh) **/
bufsize = 32; p = 0;
buffer = (char*) malloc(bufsize);
for (i = 1; i < argc; i++) {
while (p + strlen(argv[i]) + 1 >= bufsize) {
bufsize *= 2;
buffer = (char*) realloc(buffer, bufsize);
}
strcpy(buffer+p, argv[i]);
p += strlen(argv[i]) + 1;
buffer[p-1] = ' ';
}
buffer[p-1] = '\n';
XStoreBytes(display, buffer, p);
XFlush(display);
exit(0);
}
|
 |