denis@vlsisj.VLSI.COM (Denis Bohm) (08/17/90)
Here is a cut/paste tool that I wrote for DM and X a while
ago. It should be able to handle any size cut/paste buffer.
It even comes with a man page...
Denis
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# xacp.man
# xacp.c
# Makefile
# This archive created: Thu Aug 16 13:09:08 1990
export PATH; PATH=/bin:$PATH
if test -f 'xacp.man'
then
echo shar: will not over-write existing file "'xacp.man'"
else
cat << \SHAR_EOF > 'xacp.man'
.TH XACP L "1990 Aug 16"
.SH NAME
xacp \- X and apollo copy/paste utility.
.SH SYNOPSIS
.B xacp
.RB [\-hu]
.RB [\-xa]
.RB [\-b <buffer number>]
.RB [\-n <buffer name>]
.RB [\-t]
.RB [\-c]
.RB [\-p <text>]
.br
.SH DESCRIPTION
.LP
.B xacp
lets you do various things with X and apollo paste buffers. It can be used
to transfer between the X and apollo buffers, copy from X or apollo buffer
to stdout, and paste text into an X or apollo buffer.
.SH OPTIONS
Terse help information can be accessed with
.RB (\-h).
Terse usage information can be accessed with
.RB (\-u).
To select an X buffer as the primary and an apollo buffer as the secondary use
.RB (\-x),
this is the default.
To select an apollo buffer as the primary and an X buffer as the secondary use
.RB (\-a).
The X buffer number can be selected with
.RB (\-b <buffer number>).
The apollo buffer name can be selected with
.RB (\-n <buffer name>).
The operation must be one of: transfer from primary to secondary
.RB (\-t),
copy from primary to stdout
.RB (\-c),
paste text to primary
.RB (\-p <text>).
.SH USAGE
The default options are:
.nf
xacp -x -b 0 -n default.txt -t
.fi
.SH EXAMPLES
Copy X default paste buffer to apollo default paste buffer:
.nf
example% xacp
example% xacp -x
.fi
Copy apollo default paste buffer to X default paste buffer:
.nf
example% xacp -a
.fi
Copy any X paste buffer to any apollo paste buffer:
.nf
example% xacp -x -b 1 -n line_del
.fi
Setup the apollo numeric keypad + and - keys to transfer between the default X
and apollo cut/paste buffers (you might want to do put the next two lines
in ~/user_data/startup_dm.19l):
.nf
kd np+ cpo //lodi/users/denis/bin/xacp -a ke
kd np- cpo //lodi/users/denis/bin/xacp -x ke
.fi
.SH SEE ALSO
.B xcutsel (1)
.B dm (1)
.SH BUGS
.I None.
.SH AUTHORS
Denis Bohm
SHAR_EOF
fi # end of overwriting check
if test -f 'xacp.c'
then
echo shar: will not over-write existing file "'xacp.c'"
else
cat << \SHAR_EOF > 'xacp.c'
/*
* Author: Denis Bohm
* Address: denis@vlsisj
* Created: 21-Dec-1989
* File: xacp.c
*
* This program (xacp) allows you to transfer the contents of the
* X and apollo copy/paste buffers. It has options so that you can
* choose which of the X and apollo buffers to use. It also has
* options so that you can just copy a buffer to stdout and paste
* a command line argument to any buffer. It would be nice if it
* could also paste from stdin, but it doesn't right now.
*
* Users may copy, modify or distribute this file at will.
*/
#include <stdio.h>
#include <X11/Xlib.h>
#include <apollo/base.h>
#include <apollo/error.h>
#include <apollo/type_uids.h>
#include <apollo/ios.h>
#include <apollo/pbufs.h>
extern void *malloc();
void check_status (
status_$t &status
)
{
if (status.all != status_$ok) {
fprintf(stderr, "xacp: ");
error_$print(status);
exit(1);
}
}
void check_status_2 (
status_$t &status,
long exception_1,
long exception_2
)
{
if ((status.all != status_$ok) && (status.all != exception_1) &&
(status.all != exception_2)) {
fprintf(stderr, "xacp: ");
error_$print(status);
exit(1);
}
}
void pbufs_open (
char *buffer_name,
boolean &type,
ios_$id_t *stream_id,
status_$t *status
)
{
name_$long_pname_t path_name;
strcpy(path_name, "/sys/node_data/paste_buffers/");
strncat(path_name, buffer_name, name_$long_pnamlen_max - strlen(path_name));
*stream_id = ios_$open(path_name, strlen(path_name), ios_$unregulated_opt,
status);
}
void pbufs_create (
char *buffer_name,
boolean &type,
ios_$id_t *stream_id,
status_$t *status
)
{
name_$long_pname_t path_name;
strcpy(path_name, "/sys/node_data/paste_buffers/");
strncat(path_name, buffer_name, name_$long_pnamlen_max - strlen(path_name));
ios_$create(path_name, strlen(path_name), unstruct_$uid, ios_$truncate_mode,
ios_$write_opt | ios_$unregulated_opt, stream_id, status);
}
char *apollo_copy (
char *name,
)
{
#define BUFFER_SIZE 32
boolean type = false;
ios_$id_t stream_id;
status_$t status;
char buffer[BUFFER_SIZE + 1];
int amount;
int offset;
char *text;
/* how does type work? */
/* why doesn't pbufs_$open work? -denis 20-Dec-1989 */
/*
pbufs_$open(name, type, &stream_id, &status);
*/
pbufs_open(name, type, &stream_id, &status);
check_status(status);
amount = 0;
do {
amount += ios_$get(stream_id, ios_$no_put_get_opts, buffer, BUFFER_SIZE,
&status);
check_status_2(status, ios_$end_of_file, ios_$buffer_too_small);
} while (status.all != ios_$end_of_file);
text = (char *) malloc(amount);
ios_$seek_to_bof(stream_id, &status);
check_status;
offset = 0;
do {
offset += ios_$get(stream_id, ios_$no_put_get_opts, &text[offset],
amount - offset, &status);
check_status_2(status, ios_$end_of_file, ios_$buffer_too_small);
} while (status.all != ios_$end_of_file);
check_status;
ios_$close(stream_id, &status);
check_status(status);
return text;
}
void *apollo_paste (
char *name,
char *text
)
{
boolean type = false;
ios_$id_t stream_id;
status_$t status;
ios_$put_get_opts_t opts = ios_$no_put_get_opts;
/* how does type work? */
/* why doesn't pbufs_$create work? -denis 20-Dec-1989 */
/*
pbufs_$create(name, type, &stream_id, &status);
*/
pbufs_create(name, type, &stream_id, &status);
check_status(status);
ios_$put(stream_id, opts, text, strlen(text), &status);
check_status(status);
ios_$truncate(stream_id, &status);
check_status(status);
ios_$close(stream_id, &status);
check_status(status);
}
char *X_copy (
int buffer
)
{
Display *display;
char *text;
int bytes;
display = XOpenDisplay(NULL);
if (! display) {
fprintf(stderr, "xacp: can't open %s\n", XDisplayName(NULL));
exit(1);
}
text = XFetchBuffer(display, &bytes, buffer);
/*
fprintf(stderr, "%d %d\n", bytes, strlen(text));
*/
{
int i;
for (i = 0; i < bytes; i++) {
if (text[i] == '\0') {
text[i] = '*';
fprintf(stderr, "\\0 found at %d (replaced with \*)\n", i);
}
}
}
XCloseDisplay(display);
return text;
}
void X_paste (
int buffer,
char *text
)
{
Display *display;
display = XOpenDisplay(NULL);
if (! display) {
fprintf(stderr, "xacp: can't open %s\n", XDisplayName(NULL));
exit(1);
}
XStoreBuffer(display, text, strlen(text), buffer);
XCloseDisplay(display);
}
void print_usage(void)
{
fprintf(stderr,
"Usage: xacp [-h | -u] [-x | -a] [-b number] [-n name] [-t | -c | -p text]\n");
}
void print_help(void)
{
fprintf(stderr, "Name:\n");
fprintf(stderr, " xacp - X and apollo copy/paste utility.\n");
fprintf(stderr, "Options:\n");
fprintf(stderr, " -h print help message\n");
fprintf(stderr, " -u print usage message\n");
fprintf(stderr, " -x use X paste buffer as the primary (apollo as secondary)\n");
fprintf(stderr, " -a use apollo paste buffer as the primary (X as secondary)\n");
fprintf(stderr, " -b [number] specify the number of the X paste buffer to use\n");
fprintf(stderr, " -n [name] specify the name of the apollo paste buffer to use\n");
fprintf(stderr, " -t transfer from primary to secondary\n");
fprintf(stderr, " -c copy from primary to stdout\n");
fprintf(stderr, " -p [text] paste text to primary\n");
fprintf(stderr, "Default options:\n");
fprintf(stderr, " xacp -x -b 0 -n default.txt -t\n");
fprintf(stderr, "Examples:\n");
fprintf(stderr, " Copy X default paste buffer to apollo default paste buffer:\n");
fprintf(stderr, " xacp -x\n");
fprintf(stderr, " xacp\n");
fprintf(stderr, " Copy apollo default paste buffer to X default paste buffer:\n");
fprintf(stderr, " xacp -a\n");
fprintf(stderr, " Copy any X paste buffer to any apollo paste buffer:\n");
fprintf(stderr, " xacp -x -b 1 -n line_del\n");
}
main(argc, argv)
int argc;
char **argv;
{
extern int optind;
extern char *optarg;
static char *options = "vhuaxn:b:tcp:";
char *text;
char *name = "default.txt";
int buffer = 0;
int src = 'x';
int mode = 't';
int opt;
int verbose = 0;
while ((opt = getopt(argc, argv, options)) != EOF) {
switch (opt) {
case 'x':
case 'a':
src = opt;
break;
case 't':
case 'c':
case 'p':
mode = opt;
if (mode == 'p') {
text = optarg;
}
break;
case 'n':
name = ((! optarg) || (optarg[0] == '\0') ? "default.txt" : optarg);
break;
case 'b':
buffer = ((! optarg) || (optarg[0] == '\0') ? 0 : atoi(optarg));
if ((0 > buffer) || (buffer > 7)) {
fprintf(stderr,
"xacp: illegal X buffer %d (must be between 0 and 7)\n", buffer);
}
break;
case 'v':
verbose = 1;
break;
case 'h':
case 'u':
default:
print_usage();
if (opt == 'u') exit(0);
print_help();
if (opt == 'h') exit(0);
exit(1);
}
}
if (verbose) {
printf("xacp: src: %c, buffer: %d, name: %s\n", src, buffer, name);
if (mode == 'p') {
printf("xacp: text: %s\n", text);
}
}
if (mode == 't') {
if (src == 'x') {
apollo_paste(name, X_copy(buffer));
} else {
X_paste(buffer, apollo_copy(name));
}
} else if (mode == 'c') {
printf("%s", (src == 'x' ? X_copy(buffer) : apollo_copy(name)));
} else if (mode == 'p') {
if (src == 'x') {
X_paste(buffer, text);
} else {
apollo_paste(name, text);
}
}
exit(0);
}
SHAR_EOF
chmod +x 'xacp.c'
fi # end of overwriting check
if test -f 'Makefile'
then
echo shar: will not over-write existing file "'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
all: xacp
xacp: xacp.c
cc -g xacp.c -o xacp
install: xacp
cp xacp /usr/local/bin/xacp
install.man:
cp xacp.man /usr/local/man/manl/xacp.l
clean:
rm xacp
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
--
Denis Bohm (usenet: decwrl!vlsisj!denis)
(internet: vlsisj!denis@decwrl.dec.com)