koreth@ssyx.ucsc.edu (Steven Grimm) (06/27/88)
Submitted-by: uunet!mcvax!philmds!leo (Leo de Wit)
Posting-number: Volume 1, Issue 60
Archive-name: nlqps
Another nice program for printer owners. That is, if your printer does
not have NLQ capability, but does have double-density graphics. It is,
at least I think it is, as good as NLQ in hardware; besides you have
the possibility of proportional spacing.
The program consists of 3 modules: newstart.c, nlqps.c and
nlqpsdat.c and a header file: nqlps.h. It is compiled and linked with
Lattice C, but it should be easy to adapt it for other compilers. The
printer it was tested with was a Star Gemini-10X.
Generation procedure for Lattice: compile all three .c files, then
link them, together with the C library, to form a program named
nlqps.ttp. The correct linking procedure : create a link file,
nlqps.lnk, that contains:
INPUT newstart.bin
INPUT nlqps.bin
INPUT nlqpsdat.bin
LIBRARY clib.bin
and then give the command:
LINK.TTP -WITH NLQPS -NOLIST -PROG NLQPS.TTP
For a manual page I refer to the first comment in nlqps.c
L.J.M. de Wit
Nachtegaallaan 7
5731XP Mierlo
Holland
E-mail: ...!mcvax!philmds!leo
=================== SHAR ARCHIVE =========== CUT HERE =========================
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
echo 'Extracting newstart.c'
sed 's/^X//' > newstart.c << '+ END-OF-FILE newstart.c'
X/*
X ******************************************************************************
X * *
X * newstart.c version 1.1 of 18 Feb 1988 (C) L.J.M. de Wit 1988 *
X * *
X * This software may be used and distributed freely if not used commercially *
X * and the originator (me) is mentioned. *
X * *
X ******************************************************************************
X *
X * This module (the first to be linked in) may only be used when malloc and/or
X * stdio are not used.
X * Startup() is the entry point which frees memory and resets the stack.
X * Then startetc() is called which initiates argc & argv for main; they
X * could not be on start's stack because that is reset.
X * exit() is redefined to avoid linking it from the library.
X */
X
X#include <osbind.h>
X
X#define TRUE 1
X#define FALSE 0
X#define ISSPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n'))
X#define ACNT 32
X
Xtypedef unsigned char bool;
X
Xchar **environ;
X
Xstatic void startup(), startetc();
Xextern int main();
Xvoid exit();
X
Xstatic void startup(base)
Xchar *base;
X{
X int memneed;
X static short setsp[] = { /* set stack to value supplied */
X 0x2057, /* MOVEA.L (SP),A0 */
X 0x2E6F, 4, /* MOVEA.L 4(SP),SP */
X 0x4ED0 /* JMP (A0) */
X };
X extern int _mneed;
X
X memneed = 0x100 + /* base page */
X ((int *)base)[3] + /* text length */
X ((int *)base)[5] + /* data length */
X ((int *)base)[7] + /* bss length */
X 0x800 + /* workspace */
X 0x900; /* for stack */
X
X if (_mneed > memneed) { /* take more memory */
X memneed = (char *)(&memneed) - base;
X if (_mneed < memneed) { /* but nomore as requested */
X memneed = _mneed;
X }
X }
X
X Mshrink(base,memneed); /* frees mem: takes what's needed */
X (*(void (*)())setsp)(base+memneed); /* resets sp to base+memneed */
X startetc(base); /* to also have correct frame pointer */
X}
X
Xstatic void startetc(base)
Xchar *base;
X{
X int argc, i;
X char *argv[ACNT], *envp[ACNT];
X char evstr[256], *s, *t;
X bool inarg; /* whether in a argument */
X
X if ((s = ((char **)base)[11]) == (char *)0) {
X *evstr = '\0';
X } else {
X for (t = evstr; *t++ = *s++; ) ;
X }
X
X /* stack arguments */
X argv[0] = (char *)0; inarg = FALSE;
X for (argc = 1, i = 0; (argc < ACNT) && (i < (unsigned)base[128]); i++) {
X if ((base[129+i] == '\0') || ISSPACE(base[129+i])) {
X if (inarg) {
X inarg = FALSE;
X base[129+i] = '\0';
X }
X } else {
X if (!inarg) {
X inarg = TRUE;
X argv[argc++] = base+129+i;
X }
X }
X }
X base[129+i] = '\0';
X
X if (argc == ACNT) {
X Cconws("newstart: too many arguments\r\n");
X exit(1);
X }
X
X inarg = FALSE;
X for (i = 0, s = evstr; (i < ACNT) && (*s != '\0'); s++) {
X if (ISSPACE(*s)) {
X if (inarg) {
X inarg = FALSE;
X *s = '\0';
X }
X } else {
X if (!inarg) {
X inarg = TRUE;
X envp[i++] = s;
X }
X }
X }
X if (i == ACNT) {
X Cconws("newstart: too many environment variables\r\n");
X exit(1);
X }
X
X environ = envp;
X
X argv[argc] = (char *)0;
X envp[i] = (char *)0;
X main(argc,argv,envp);
X exit(0);
X}
X
Xvoid exit(code)
Xint code;
X{
X Pterm(code);
X}
+ END-OF-FILE newstart.c
chmod 'u=rw,g=r,o=' 'newstart.c'
echo 'SENT: -rw-r----- 1 leo 3688 Jun 24 12:30 newstart.c'
echo -n 'RCVD: '
/bin/ls -l newstart.c
echo 'Extracting nlqps.c'
sed 's/^X//' > nlqps.c << '+ END-OF-FILE nlqps.c'
X/*
X ******************************************************************************
X * *
X * nlqps.c version 1.1 of 24 June 1988 (C) L.J.M. de Wit 1988 *
X * *
X * This software may be used and distributed freely if not used commercially *
X * and the originator (me) is mentioned. *
X * *
X ******************************************************************************
X *
X * NAME
X * nlqps - print with Near Letter Quality and Proportional Spacing
X *
X * SYNTAX
X * nlqps.ttp [-n|-N] [file ...]
X *
X * DESCRIPTION
X * This program is meant for use with printers that have no NLQ capability.
X * The printer SHOULD have double density graphics capability and capability
X * of sending a LF of half a scanline high (1/144 inch). The Star Gemini-10X
X * is an example. If the escape sequences for your printer are different,
X * you should alter the macros LP_SMALL_LF() (1/144 inch linefeed),
X * LP_BIG_LF() (23/144 inch linefeed) and LP_DD_GRAPH() (double density
X * graphics) accordingly.
X *
X * The program prints your file(s) (or standard input for pipes) in a
X * standard NLQ fashion, i.e. the line is printed twice in graphics mode
X * with complementary fonts and a very small linefeed inbetween. The total
X * linefeed is still 1/144 + 23/144 = 1/6 inch, which is a standard
X * line height.
X *
X * A nice feature of this program is that it does proportional spacing as
X * well; if this is not desired (e.g. when printing tables, columns, program
X * listings) this feature can be turned off by the -n switch; n for
X * non-proportional (-N is the same and only needed because silly uppercase
X * conversion of the parameter line when running TTP's from the Desktop).
X *
X * BUGS/SHORTCOMINGS
X * The program is not activated when printing files from the Desktop. The
X * question is: Is automatic NLQ printing desired (printing without NLQ
X * becomes harder) ?
X *
X * The program does not yet provide for different NLQ fonts. This is however
X * not hard (loading a file into the nlqfont struct) but only useful with
X * an editor program for such a font.
X *
X * DECISIONS
X * For compactness of code the module should be linked with newstart.bin
X * instead of startup.bin (the standard first module and entry point of the
X * program). This new startup module avoids using stdio (not needed here),
X * resulting in a much smaller program: 4435 bytes instead of 14036!
X * The standard C library IS used (for the gemdos/bios interface).
X * One should create a link file, nlqps.lnk, that contains:
X * INPUT newstart.bin
X * INPUT nlqps.bin
X * INPUT nlqpsdat.bin
X * LIBRARY clib.bin
X * and the command to be given is:
X * LINK.TTP -WITH NLQPS -NOLIST -PROG NLQPS.TTP
X * The function startup() in newstart.c is used as entry point, so
X * newstart.bin must be the first module to be linked in.
X */
X
X#include <osbind.h>
X#include <portab.h>
X#include "nlqps.h"
X
X#define BUFSIZ 512 /* from stdio.h */
X
X#define SET0 0 /* denotes set to be used in second scan */
X#define SET1 1 /* denotes set to be used in first scan */
X#define INTERSPACE 3 /* space between characters in dot columns */
X#define ESC 27 /* escape character */
X#define BUFLEN 256 /* max size of character buffer for one line */
X#define MAXSCAN 960 /* max # of dot columns per line */
X#define CHARWIDTH 12 /* width of char in dot columns if non-proportional */
X
X#define LP(c) Bconout(0,(c))
X#define LP_SMALL_LF() (LP(ESC),LP(74),LP(1))
X#define LP_BIG_LF() (LP(ESC),LP(74),LP(23))
X#define LP_DD_GRAPH() (LP(ESC),LP('L'))
X
Xstatic void prline(), nlq();
Xstatic int lookup();
X
Xstatic int notprop;
X
Xint main(argc,argv)
Xint argc;
Xchar **argv;
X{
X int i, fd;
X
X i = 1;
X
X notprop = (argc >= 2) /* Check argv[1] for "-n" or "-N" */
X && (argv[i][0] == '-')
X && ((argv[i][1] == 'n') || (argv[i][1] == 'N'));
X if (notprop) i++;
X
X if (i == argc) {
X nlq(0); /* Nlq the standard input */
X } else {
X for ( ; i < argc; i++) {
X if ((fd = Fopen(argv[i],0)) < 0) {
X Cconws("nlqps: "); Cconws(argv[i]); Cconws(": cannot open\r\n");
X } else {
X nlq(fd); /* Nlq the file */
X Fclose(fd);
X }
X }
X }
X}
X
Xstatic void nlq(fd) /* Print from filedescriptor fd */
Xint fd; /* in NLQ with prop. spacing */
X{
X char inbuf[BUFSIZ], /* Input buffer for reads from fd */
X *ibp = inbuf, /* For reading a char from inbuf */
X c;
X char buf[BUFLEN], /* Line to print (still ASCII) */
X *dummy;
X int bufcnt = 0, /* # chars in buf sofar */
X scancnt = 0, /* # dot columns sofar */
X nread = 0; /* # bytes read into inbuf */
X
X do {
X if (inbuf + nread == ibp) { /* Read all chars from inbuf */
X if ((nread = Fread(fd,sizeof(inbuf),inbuf)) <= 0) { /* Fill inbuf */
X break; /* End-of-file */
X }
X ibp = inbuf; /* Pointer at buffer start */
X }
X c = *ibp++; /* Read 1 char from inbuf */
X if ((c == '\n') /* Had newline */
X || (bufcnt == BUFLEN) /* .. or max # characters */
X || (scancnt > MAXSCAN - 9)) { /* .. or max # dot columns */
X
X if (scancnt > 0) { /* Do first scan */
X LP_DD_GRAPH(); /* Select dd graphics */
X LP(scancnt & 0xff); /* # dot columns: low byte */
X LP((scancnt >> 8) & 0xff); /* # dot columns: high byte */
X prline(buf,bufcnt,SET1); /* Print buf graphic with SET1 */
X }
X LP_SMALL_LF(); /* Send a 1/144 inch LF */
X if (scancnt > 0) { /* Do second scan */
X LP_DD_GRAPH();
X LP(scancnt & 0xff);
X LP((scancnt >> 8) & 0xff);
X prline(buf,bufcnt,SET0); /* Print buf graphic with SET0 */
X }
X LP_BIG_LF(); /* Send a 23/144 inch LF */
X bufcnt = scancnt = 0; /* Reset buf parameters */
X }
X if (c != '\n') { /* normal character */
X buf[bufcnt++] = c; /* Put it into buf; update bufcnt */
X scancnt += (notprop) /* .. and scancnt: */
X ? CHARWIDTH /* constant CHARWIDTH if not prop.*/
X : lookup(c,SET0,&dummy) /* real character width + space */
X + INTERSPACE; /* If proportional */
X }
X } while (TRUE);
X}
X
Xstatic void prline(buf,bufcnt,set) /* Print the buf (bufcnt chars) */
Xchar *buf; /* with this set in graphic mode */
Xint bufcnt, set;
X{
X int i, j,
X scancnt; /* width of char in dot columns */
X char *ch_start; /* start of char bit image (9) */
X
X for (i = 0; i < bufcnt; i++) { /* For each char in buf */
X scancnt = lookup(buf[i],set,&ch_start);/* set width and start */
X for (j = 0; j < scancnt; j++) { /* Do each dot column */
X LP(ch_start[j]);
X }
X for (j = (notprop) ? CHARWIDTH - scancnt : INTERSPACE; j > 0; --j) {
X LP(0); /* Print empty column as spacing */
X }
X }
X}
X
Xstatic int lookup(c,set,csp) /* Get byte image start & # dot */
Xchar c, **csp; /* columns for this char and set */
Xint set;
X{
X int retval;
X
X c -= ' ';
X if ((c >= 0) && (c < 128 - ' ')) {
X retval = nlqfont[c].nlq_width;
X *csp = (set == SET0) ? nlqfont[c].nlq_set0 : nlqfont[c].nlq_set1;
X } else { /* If c out of range */
X retval = 0;
X *csp = "";
X }
X return retval; /* actual width of image */
X}
+ END-OF-FILE nlqps.c
chmod 'u=rw,g=r,o=' 'nlqps.c'
echo 'SENT: -rw-r----- 1 leo 8759 Jun 24 12:41 nlqps.c'
echo -n 'RCVD: '
/bin/ls -l nlqps.c
echo 'Extracting nlqps.h'
sed 's/^X//' > nlqps.h << '+ END-OF-FILE nlqps.h'
X/*
X ******************************************************************************
X * *
X * nlqps.h version 1.1 of 24 June 1988 (C) L.J.M. de Wit 1988 *
X * *
X * This software may be used and distributed freely if not used commercially *
X * and the originator (me) is mentioned. *
X * *
X ******************************************************************************
X *
X * nlqps.h: typedef & external declaration for nlqps
X */
X
Xtypedef struct nlqchar {
X unsigned char nlq_width;
X char nlq_set0[9];
X char nlq_set1[9];
X} nlqchar;
X
Xextern nlqchar nlqfont[];
+ END-OF-FILE nlqps.h
chmod 'u=rw,g=r,o=' 'nlqps.h'
echo 'SENT: -rw-r----- 1 leo 837 Jun 24 12:28 nlqps.h'
echo -n 'RCVD: '
/bin/ls -l nlqps.h
echo 'Extracting nlqpsdat.c'
sed 's/^X//' > nlqpsdat.c << '+ END-OF-FILE nlqpsdat.c'
X/*
X ******************************************************************************
X * *
X * nlqpsdat.c version 1.1 of 24 June 1988 (C) L.J.M. de Wit 1988 *
X * *
X * This software may be used and distributed freely if not used commercially *
X * and the originator (me) is mentioned. *
X * *
X ******************************************************************************
X *
X * nlqpsdat.c: This file contains the (initialized) structure for the
X * nlqps font.
X */
X
X#include "nlqps.h"
X
Xnlqchar nlqfont[] = {
X/* ' ' */ {6, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0},
X/* '!' */ {1, 224,0,0,0,0,0,0,0,0, 242,0,0,0,0,0,0,0,0},
X/* '"' */ {5, 192,0,0,0,192,0,0,0,0, 224,0,0,0,224,0,0,0,0},
X/* '#' */ {9, 0,0,252,0,0,0,252,0,0, 40,40,254,40,40,40,254,40,40},
X/* '$' */ {9, 96,0,0,0,252,0,0,0,24, 32,84,84,84,254,84,84,84,8},
X/* '%' */ {9, 128,0,132,8,16,32,68,128,4, 192,194,196,8,16,32,70,134,6},
X/* '&' */ {9, 200,20,32,16,192,12,0,12,0, 76,160,146,162,74,0,4,0,10},
X/* ''' */ {3, 0,0,192,0,0,0,0,0,0, 160,160,192,0,0,0,0,0,0},
X/* '(' */ {3, 48,204,0,0,0,0,0,0,0, 56,68,130,0,0,0,0,0,0},
X/* ')' */ {3, 0,204,48,0,0,0,0,0,0, 130,68,56,0,0,0,0,0,0},
X/* '*' */ {7, 72,0,48,252,48,0,72,0,0, 68,40,16,254,16,40,68,0,0},
X/* '+' */ {9, 0,0,0,0,120,0,0,0,0, 16,16,16,16,124,16,16,16,16},
X/* ',' */ {3, 5,5,6,0,0,0,0,0,0, 6,6,7,0,0,0,0,0,0},
X/* '-' */ {9, 0,0,0,0,0,0,0,0,0, 16,16,16,16,16,16,16,16,16},
X/* '.' */ {4, 6,6,6,6,0,0,0,0,0, 2,2,2,2,0,0,0,0,0},
X/* '/' */ {7, 0,4,8,16,32,64,128,0,0, 2,4,8,16,32,64,128,0,0},
X/* '0' */ {9, 48,204,0,0,0,0,0,204,48, 56,68,130,130,130,130,130,68,56},
X/* '1' */ {5, 0,128,252,0,0,0,0,0,0, 66,66,254,2,2,0,0,0,0},
X/* '2' */ {9, 0,132,0,8,0,16,0,160,64, 66,2,134,130,138,130,146,2,98},
X/* '3' */ {9, 0,4,0,0,0,96,0,148,8, 132,128,130,130,162,130,210,128,140},
X/* '4' */ {9, 0,16,32,64,128,0,252,0,0, 8,24,40,72,136,136,254,8,8},
X/* '5' */ {9, 192,4,0,0,0,0,0,36,24, 228,160,162,162,162,162,162,128,156},
X/* '6' */ {9, 8,20,32,64,128,0,0,20,8, 12,16,50,82,146,18,18,0,12},
X/* '7' */ {9, 0,0,0,4,8,16,32,64,128, 128,128,130,132,136,144,160,192,128},
X/* '8' */ {9, 72,180,0,0,0,0,0,180,72, 108,0,146,146,146,146,146,0,108},
X/* '9' */ {9, 64,160,0,0,4,8,16,160,64, 96,0,144,144,146,148,152,16,96},
X/* ':' */ {4, 36,36,36,36,0,0,0,0,0, 54,54,54,54,0,0,0,0,0},
X/* ';' */ {4, 37,37,37,38,0,0,0,0,0, 54,54,54,55,0,0,0,0,0},
X/* '<' */ {7, 0,48,0,72,0,132,0,0,0, 16,0,40,0,68,0,130,0,0},
X/* '=' */ {9, 0,0,0,0,0,0,0,0,0, 40,40,40,40,40,40,40,40,40},
X/* '>' */ {7, 0,132,0,72,0,48,0,0,0, 130,0,68,0,40,0,16,0,0},
X/* '?' */ {9, 0,128,0,0,0,16,0,160,64, 64,0,128,128,138,138,144,0,96},
X/* '@' */ {9, 120,132,0,48,0,0,0,128,112, 124,0,130,146,170,170,170,42,114},
X/* 'A' */ {9, 28,32,64,128,0,128,64,32,28, 30,40,72,136,136,136,72,40,30},
X/* 'B' */ {9, 0,252,0,0,0,0,0,180,72, 130,254,146,146,146,146,146,0,108},
X/* 'C' */ {9, 120,132,0,0,0,0,0,132,0, 124,0,130,130,130,130,130,0,68},
X/* 'D' */ {9, 0,252,0,0,0,0,0,132,120, 130,254,130,130,130,130,130,68,56},
X/* 'E' */ {9, 252,0,0,0,0,0,0,0,0, 254,146,146,146,146,146,146,130,130},
X/* 'F' */ {9, 252,0,0,0,0,0,0,0,0, 254,144,144,144,144,144,144,128,128},
X/* 'G' */ {9, 120,132,0,0,0,0,0,4,24, 124,0,130,130,146,146,146,144,28},
X/* 'H' */ {9, 252,0,0,0,0,0,0,0,252, 254,16,16,16,16,16,16,16,254},
X/* 'I' */ {5, 0,0,252,0,0,0,0,0,0, 130,130,254,130,130,0,0,0,0},
X/* 'J' */ {8, 8,4,0,0,0,4,248,0,0, 12,0,2,130,130,128,252,128,0},
X/* 'K' */ {9, 252,0,0,48,0,72,0,132,0, 254,16,16,0,40,0,68,0,130},
X/* 'L' */ {9, 252,0,0,0,0,0,0,0,0, 254,2,2,2,2,2,2,2,2},
X/* 'M' */ {9, 252,128,64,32,0,32,64,128,252, 254,128,64,32,16,32,64,128,254},
X/* 'N' */ {9, 252,0,128,64,32,16,8,4,252, 254,128,64,32,16,8,4,2,254},
X/* 'O' */ {9, 120,132,0,0,0,0,0,132,120, 124,0,130,130,130,130,130,0,124},
X/* 'P' */ {9, 252,0,0,0,0,0,0,160,64, 254,144,144,144,144,144,144,0,96},
X/* 'Q' */ {9, 120,132,0,0,0,8,0,132,120, 124,0,130,130,138,130,134,0,126},
X/* 'R' */ {9, 252,0,0,0,0,16,8,164,64, 254,144,144,144,144,144,152,4,98},
X/* 'S' */ {9, 64,164,0,0,0,0,0,148,8, 100,0,146,146,146,146,146,0,76},
X/* 'T' */ {9, 0,0,0,0,252,0,0,0,0, 128,128,128,128,254,128,128,128,128},
X/* 'U' */ {9, 248,4,0,0,0,0,0,4,248, 252,0,2,2,2,2,2,0,252},
X/* 'V' */ {9, 224,16,8,4,0,4,8,16,224, 224,16,8,4,2,4,8,16,224},
X/* 'W' */ {9, 252,0,4,8,16,8,4,0,252, 252,2,4,8,16,8,4,2,252},
X/* 'X' */ {7, 132,72,48,0,48,72,132,0,0, 130,68,40,16,40,68,130,0,0},
X/* 'Y' */ {9, 128,64,32,16,12,16,32,64,128, 128,64,32,16,14,16,32,64,128},
X/* 'Z' */ {7, 0,4,8,16,32,64,128,0,0, 130,134,138,146,162,194,130,0,0},
X/* '[' */ {5, 252,0,0,0,0,0,0,0,0, 254,130,130,130,130,0,0,0,0},
X/* '\' */ {7, 128,64,32,16,8,4,0,0,0, 128,64,32,16,8,4,2,0,0},
X/* ']' */ {5, 0,0,0,0,252,0,0,0,0, 130,130,130,130,254,0,0,0,0},
X/* '^' */ {9, 0,64,0,128,0,128,0,64,0, 32,0,64,0,128,0,64,0,32},
X/* '_' */ {9, 1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0},
X/* '`' */ {4, 128,64,0,0,0,0,0,0,0, 192,128,160,160,0,0,0,0,0},
X/* 'a' */ {9, 0,12,0,0,0,0,32,28,0, 4,0,42,42,42,42,10,28,2},
X/* 'b' */ {8, 252,0,0,0,0,0,36,24,0, 254,34,34,34,34,34,0,28,0},
X/* 'c' */ {8, 24,36,0,0,0,0,0,0,0, 28,0,34,34,34,34,34,34,0},
X/* 'd' */ {8, 24,36,0,0,0,0,0,252,0, 28,0,34,34,34,34,34,254,0},
X/* 'e' */ {9, 24,36,0,0,0,0,0,32,16, 28,8,42,42,42,42,42,10,24},
X/* 'f' */ {7, 0,0,0,124,128,0,0,0,0, 16,16,16,126,16,144,144,0,0},
X/* 'g' */ {8, 24,36,1,1,1,1,0,62,0, 28,0,34,34,34,34,35,62,0},
X/* 'h' */ {8, 252,0,0,0,0,0,32,28,0, 254,32,32,32,32,32,0,30,0},
X/* 'i' */ {5, 0,0,60,0,0,0,0,0,0, 34,34,190,2,2,0,0,0,0},
X/* 'j' */ {6, 1,1,1,1,0,62,0,0,0, 0,0,0,32,33,190,0,0,0},
X/* 'k' */ {7, 252,0,0,24,0,36,0,0,0, 254,8,8,0,20,0,34,0,0},
X/* 'l' */ {5, 0,0,252,0,0,0,0,0,0, 130,130,254,2,2,0,0,0,0},
X/* 'm' */ {9, 60,32,0,0,60,0,0,32,28, 62,0,32,32,62,32,32,0,30},
X/* 'n' */ {8, 60,0,0,0,0,0,32,28,0, 62,32,32,32,32,32,0,30,0},
X/* 'o' */ {9, 24,36,0,0,0,0,0,36,24, 28,0,34,34,34,34,34,0,28},
X/* 'p' */ {8, 63,0,0,0,0,0,36,24,0, 63,34,34,34,34,34,0,28,0},
X/* 'q' */ {8, 24,36,0,0,0,0,0,63,0, 28,0,34,34,34,34,34,63,0},
X/* 'r' */ {8, 60,0,32,0,0,0,0,0,0, 62,16,0,32,32,32,32,32,0},
X/* 's' */ {9, 0,48,0,0,0,0,0,12,0, 16,2,42,42,42,42,42,32,4},
X/* 't' */ {8, 0,0,248,4,0,0,0,0,0, 32,32,252,32,34,34,34,2,0},
X/* 'u' */ {9, 56,4,0,0,0,0,0,60,0, 60,0,2,2,2,2,2,60,2},
X/* 'v' */ {9, 32,16,8,4,0,4,8,16,32, 32,16,8,4,2,4,8,16,32},
X/* 'w' */ {9, 60,0,4,8,16,8,4,0,60, 60,2,4,8,16,8,4,2,60},
X/* 'x' */ {7, 0,36,24,0,24,36,0,0,0, 34,20,0,8,0,20,34,0,0},
X/* 'y' */ {9, 32,16,8,5,2,4,8,16,32, 32,16,8,5,2,4,8,16,32},
X/* 'z' */ {8, 4,0,8,0,16,0,32,0,0, 34,38,34,42,34,50,34,34,0},
X/* '{' */ {6, 0,48,72,132,0,0,0,0,0, 16,0,108,0,130,130,0,0,0},
X/* '|' */ {1, 204,0,0,0,0,0,0,0,0, 238,0,0,0,0,0,0,0,0},
X/* '}' */ {6, 0,0,132,72,48,0,0,0,0, 130,130,0,108,0,16,0,0,0},
X/* '~' */ {9, 0,128,0,128,0,64,0,64,0, 64,0,128,0,64,0,32,0,64},
X/*'DEL'*/ {9, 120,132,48,72,72,72,0,132,120, 124,0,0,0,0,0,0,0,0}
X};
+ END-OF-FILE nlqpsdat.c
chmod 'u=rw,g=r,o=' 'nlqpsdat.c'
echo 'SENT: -rw-r----- 1 leo 7848 Jun 24 12:29 nlqpsdat.c'
echo -n 'RCVD: '
/bin/ls -l nlqpsdat.c
exit 0