Screen dump for 24-pin Epson
Roger M. Shimada
rms at gorf.UUCP
Sun Jun 30 06:53:50 AEST 1991
>From the README:
This is a replacement screen dump program of users of AT&T 3B1/7300s who have
Epson compatible 24-pin printers. It has only been tested on the author's
Panasonic KX-P1124 in Epson mode.
--
Roger M. Shimada rms at gorf.mn.org -or- rms at gorf.sialis.com
(Whichever works for you! :-()
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: Makefile README sprint.c
# Wrapped by rms at gorf.mn.org on Sat Jun 29 15:33:13 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Makefile -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(324 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
XCFLAGS = -O
XSHAREDLIB = /lib/crt0s.o /lib/shlib.ifile
X
Xsprint: sprint.o
X $(LD) -s -o $@ $(SHAREDLIB) sprint.o
X
Xinstall: sprint
X -test -f /usr/bin/sprint -a ! -f /usr/bin/sprint.old \
X && mv /usr/bin/sprint /usr/bin/sprint.old
X cp sprint /usr/bin
X
Xdeinstall:
X mv /usr/bin/sprint.old /usr/bin/sprint
X
Xclean:
X rm -f sprint *.o
END_OF_Makefile
if test 324 -ne `wc -c <Makefile`; then
echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f README -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"README\"
else
echo shar: Extracting \"README\" \(1722 characters\)
sed "s/^X//" >README <<'END_OF_README'
XThis is a replacement screen dump program of users of AT&T 3B1/7300s who have
XEpson compatible 24-pin printers. It has only been tested on the author's
XPanasonic KX-P1124 in Epson mode. To work at all, /usr/spool/lp/default must
Xcontain the name of the appropriate printer.
X
XIf running UA, type:
X
X make install
X
Xwhich will save your current screen dump program and install this one. Note
Xthat the Makefile is smart enough to detect whether it has previously saved
Xthe "old" version, so typing "make install" repeatably is harmless.
X
XThis program takes the liberty of printing a blank line before and after the
Xactual screen dump and assumes 1/6 inch linefeeds.
X
XUnlike the current screen dump program, this program gives a list of formats
Xto print in. One can also decide not to print at all. The sizes are big,
Xmedium, and small. Big creates a dump almost as large as the screen itself
X(and too big to fit two dumps on an 11 inch sheet - it's as high as the normal
XEpson screen dump, but wider). Medium fits two screen dumps on an 11 inch
Xsheet easily. Small is half the width of big, and half the height of medium
X(plain 180 dpi x 180 dpi) and the KX-P1124 has pins too big to make such a
Xdump clearly readable. The default size is normal.
X
XRequired control sequences:
X ESC 2 set linefeed to 1/6 inch (all)
X ESC 3 n set linefeed to n/180 inch (all)
X ESC * n1 n2 print n2*256+n1 graphic columns at 90 dpi (Big)
X ESC ! n1 n2 print n2*256+n1 graphic columns at 120 dpi (Medium)
X ESC ' n1 n2 print n2*256+n1 graphic columns at 180 dpi (Small)
X
XAll this just 'cuz I wanted two screen dumps per page... :-)
X
X--
XRoger M. Shimada rms at gorf.mn.org -or- rms at gorf.sialis.com
X (Whichever works for you! :-()
END_OF_README
if test 1722 -ne `wc -c <README`; then
echo shar: \"README\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f sprint.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"sprint.c\"
else
echo shar: Extracting \"sprint.c\" \(4997 characters\)
sed "s/^X//" >sprint.c <<'END_OF_sprint.c'
X/*
X Replacement screen dump program for AT&T 3B1/7300 for owners of Epson
X compatible 24-pin printers (only tested on the Panasonic KX-P1124.)
X
X To be installed as /usr/bin/sprint (the program called when
X shift-Print is pressed using UA.)
X
X Yes, the code could be smaller...but I wanted to save a few cycles.
X
X Roger M. Shimada rms at gorf.mn.org -or- rms at gorf.sialis.com
X (Whichever works for you! :-()
X*/
X
X#include <fcntl.h>
X#include <kcodes.h>
X#include <menu.h>
X#include <message.h>
X#include <stdio.h>
X#include <tam.h>
X#include <sys/window.h>
X
X#define SROWS 348
X#define SCOLS 720
X
X#define SLINE (SCOLS/16)
X
Xmitem_t Myitems[] = {
X "Big - Almost size of screen", 0, 0,
X "Medium - Two fit per 11 inch page", 0, 1,
X "Small - Show off printer's 180 dpi", 0, 2,
X 0, 0, 0,
X};
X
Xmenu_t Mymenu = {
X "Screen dump size",
X "Should work with Epson compatible 24-pin printers",
X "Select with ENTER, or press CANCEL to bail out",
X 0, 1, 0, 0,
X M_SINGLE,
X "",
X 0, 0, 0, 0, 0,
X Myitems,
X &Myitems[1],
X 0,
X};
X
Xchar *Window = "/dev/window";
Xchar *LpDefault = "/usr/spool/lp/default";
X
Xunsigned short Screen[SROWS + 23][SLINE];
Xunsigned short Current[24];
X
XFILE *Pipe;
X
XBigGroup(SRow)
Xint SRow;
X{
X register char *Data;
X int Out;
X int Short;
X register int SBit;
X register int PBit;
X register int PRow;
X
X Data = ((char *)&Out) + 1;
X fprintf(Pipe, "\033*&%c%c", SCOLS & 0xff, SCOLS >> 8); /* 90 dpi */
X for (Short = 0; Short < SLINE; ++Short) {
X for (PRow = 0; PRow < 8; ++PRow)
X Current[PRow] = Screen[SRow + PRow][Short];
X for (SBit = 1; SBit < 0x10000; SBit <<= 1) {
X PBit = 7 << 21;
X Out = 0;
X for (PRow = 0; PRow < 8; ++PRow) {
X if (Current[PRow] & SBit)
X Out |= PBit;
X
X PBit >>= 3;
X }
X fwrite(Data, 3, 1, Pipe);
X }
X }
X fputc('\n', Pipe);
X}
X
XMediumGroup(SRow)
Xint SRow;
X{
X register char *Data;
X int Out;
X int Short;
X register int SBit;
X register int PBit;
X register int PRow;
X
X Data = ((char *)&Out) + 1;
X fprintf(Pipe, "\033*!%c%c", SCOLS & 0xff, SCOLS >> 8); /* 120 dpi */
X for (Short = 0; Short < SLINE; ++Short) {
X for (PRow = 0; PRow < 12; ++PRow)
X Current[PRow] = Screen[SRow + PRow][Short];
X for (SBit = 1; SBit < 0x10000; SBit <<= 1) {
X PBit = 3 << 22;
X Out = 0;
X for (PRow = 0; PRow < 12; ++PRow) {
X if (Current[PRow] & SBit)
X Out |= PBit;
X
X PBit >>= 2;
X }
X fwrite(Data, 3, 1, Pipe);
X }
X }
X fputc('\n', Pipe);
X}
X
XSmallGroup(SRow)
Xint SRow;
X{
X register char *Data;
X int Out;
X int Short;
X register int SBit;
X register int PBit;
X register int PRow;
X
X Data = ((char *)&Out) + 1;
X fprintf(Pipe, "\033*'%c%c", SCOLS & 0xff, SCOLS >> 8); /* 180 dpi */
X for (Short = 0; Short < SLINE; ++Short) {
X for (PRow = 0; PRow < 24; ++PRow)
X Current[PRow] = Screen[SRow + PRow][Short];
X for (SBit = 1; SBit < 0x10000; SBit <<= 1) {
X PBit = 1 << 23;
X Out = 0;
X for (PRow = 0; PRow < 24; ++PRow) {
X if (Current[PRow] & SBit)
X Out |= PBit;
X
X PBit >>= 1;
X }
X fwrite(Data, 3, 1, Pipe);
X }
X }
X fputc('\n', Pipe);
X}
X
Xmain()
X{
X char PipeCmd[128];
X char Default[64];
X int Bytes;
X int Fd;
X int I;
X int OrgWin;
X int Ret;
X int MenuOp;
X extern int errno;
X
X Fd = open(Window, O_RDWR);
X if (Fd < 0) {
X fprintf(stderr, "Can't open %s\n", Window);
X exit(errno);
X }
X if (ioctl(Fd, WIOCREAD, Screen) < 0) {
X fprintf(stderr, "Read of screen failed\n");
X exit(errno);
X }
X close(Fd);
X Fd = open(LpDefault, O_RDONLY);
X if (Fd < 0) {
X fprintf(stderr, "Open of %s failed\n", LpDefault);
X exit(errno);
X }
X Bytes = read(Fd, Default, sizeof(Default));
X if (Bytes < 1) {
X fprintf(stderr, "Read of %s failed\n", LpDefault);
X exit(errno);
X }
X close(Fd);
X Default[Bytes - 1] = 0;
X sprintf(PipeCmd, "lp -d%s_R", Default);
X switch (fork()) {
X case -1:
X I = errno;
X fprintf(stderr, "fork() failed\n");
X exit(I);
X
X case 0:
X close(0);
X close(1);
X Fd = open(Window, O_RDWR);
X if (Fd < 0) {
X I = errno;
X fprintf(stderr, "open of %s failed\n", Window);
X exit(I);
X }
X dup(Fd);
X winit();
X keypad(0, 1);
X MenuOp = M_BEGIN | M_INPUT;
X do {
X Ret = menu(&Mymenu, MenuOp);
X MenuOp &= ~M_BEGIN;
X if (Ret < 0) {
X fprintf(stderr,
X "Error %d from menu()\n", Ret);
X wexit(127);
X }
X if (Ret == Exit || Ret == Cancl || Ret == Close)
X wexit(126);
X } while (Ret != Enter);
X wexit(Mymenu.m_curi->mi_val);
X
X default:
X wait(&Ret);
X if (Ret & 0xff)
X exit(0);
X
X Ret >>= 8;
X if (Ret == 126)
X exit(0);
X
X if (Ret > 2)
X exit(1);
X
X break;
X }
X Pipe = popen(PipeCmd, "w");
X if (Pipe == NULL) {
X I = errno;
X fprintf(stderr, "Popen of %s failed\n", PipeCmd);
X exit(I);
X }
X fprintf(Pipe, "\n\0333%c", 24); /* lf is 24/180" */
X switch (Ret) {
X case 0: /* big */
X for (I = 0; I < SROWS; I += 8)
X BigGroup(I);
X break;
X
X case 1: /* medium */
X for (I = 0; I < SROWS; I += 12)
X MediumGroup(I);
X break;
X
X case 2: /* small */
X for (I = 0; I < SROWS; I += 24)
X SmallGroup(I);
X break;
X }
X fprintf(Pipe, "\0332\n"); /* lf is 1/6" */
X pclose(Pipe);
X exit(0);
X}
END_OF_sprint.c
if test 4997 -ne `wc -c <sprint.c`; then
echo shar: \"sprint.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0
More information about the Comp.sys.3b1
mailing list