mark@unisec.UUCP (05/15/87)
The following shell archive contains a modified version of the format
program which comes with C-Power, along with instructions for creating the
docs to MRterm. Don't forget to translate thise files to CBM ASCII prior
to (or after, if you prefer) downloading to your C64.
#---------------------------- c u t h e r e ------------------------------
#! /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:
# docs.readme
# efmt.h
# efmt1.c
# efmt2.c
# This archive created: Fri May 15 14:44:24 1987
export PATH; PATH=/bin:$PATH
if test -f 'docs.readme'
then
echo shar: will not over-write existing file "'docs.readme'"
else
cat << \SHAR_EOF > 'docs.readme'
The MRterm documenntation consists of a set of files, named s1..s11,
which must be formatted by a modified version of the format program, named
efmt. The source for efmt is included with the documentation.
I ran into a problem with format since I had more filename parameters
than the C-Power shell would allow me to pass (max is 9, I believe). So,
I added a new feature to format which allows each file to specify its
successor. The new program is thus named efmt (extended format). To
create the document, first compile and link efmt, then do the following:
$ efmt s1 > mrterm.doc
$ pr mrterm.doc >>
or
$ efmt s1 >> (format directly to printer)
OK? OK!
Mark Rinfret
SHAR_EOF
fi # end of overwriting check
if test -f 'efmt.h'
then
echo shar: will not over-write existing file "'efmt.h'"
else
cat << \SHAR_EOF > 'efmt.h'
/*
Extended Formatter Definitions
Filename: efmt.h
*/
#define INSIZE 100
#define MAXLINE 100
#define MAXOUT 200
#define COMMAND '.'
#define PAGENUM '#'
#define HUGE 1000
#define PAGELEN 66
#define PAGEWIDTH 60
#define YES 1
#define NO 0
#define MARGIN 3
#define UNKNOWN 0
#define FI 1
#define NF 2
#define BR 3
#define LS 4
#define BP 5
#define SP 6
#define IN 7
#define RM 8
#define TI 9
#define CE 10
#define HE 11
#define FO 12
#define PL 13
#define M1 14
#define M2 15
#define M3 16
#define M4 17
#define NE 18
#define NX 19
#define NCMDS 19
#define max(x,y) ( (x) > (y) ? (x) : (y) )
#define min(x,y) ( (x) > (y) ? (y) : (x) )
SHAR_EOF
fi # end of overwriting check
if test -f 'efmt1.c'
then
echo shar: will not over-write existing file "'efmt1.c'"
else
cat << \SHAR_EOF > 'efmt1.c'
/* Extended Text Formatter - Part 1
** Filename: efmt1.c
** History:
** 07/29/86 - MRR - added .nx command
*/
#include <stdio.h>
#include "efmt.h"
int fill, /* fill is YES */
lsval, /* current line spacing */
inval, /* current indent */
rmval, /* current right margin */
tival, /* current temporary indent */
ceval, /* number of lines to center */
curpag, /* current output page number */
newpag, /* next output page number */
lineno, /* next line to be printed */
newfile, /* 1 => .nx processed */
plval, /* page length in lines */
m1val, /* margin before and including header */
m2val, /* margin after header */
m3val, /* margin after last line */
m4val, /* bottom margin, including footer */
bottom; /* last live line on page, = plval - m3val - m4val */
char headl[MAXLINE], headc[MAXLINE], headr[MAXLINE]; /* top of page title */
char footl[MAXLINE], footc[MAXLINE], footr[MAXLINE]; /* end of page title */
char newname[20];
char outbuf[MAXOUT]; /* output buffer */
int outp, /* last char position in outbuf */
outw, /* width of text currently in outbuf */
outwds; /* number of words in outbuf */
FILE infile; /* input file */
main (argc, argv) /* text formatter */
unsigned argc;
char **argv;
{
init();
if (argc == 1) {
format (stdin);
cknew ();
}
else
while (--argc) {
openit (*++argv);
format (infile);
fclose (infile);
cknew ();
}
if (lineno > 0)
space (HUGE);
}
openit(s)
char *s;
{
if ((infile = openfile (s, "r")) == NULL || ferror()) {
printf ("Can't open %s\n", s);
exit();
}
}
/* See if there is a new file to be
processed as a result of a .nx
command.
*/
cknew ()
{
while (newfile) {
newfile = 0;
openit (newname);
format (infile);
fclose (infile);
}
}
format (fin)
FILE fin;
{
static char inbuf[INSIZE];
while (fgets (inbuf, INSIZE, fin) != NULL)
if (*inbuf == COMMAND) {
command (inbuf);
if (newfile) return;
}
else
text (inbuf);
}
init() /* initialize variables */
{
curpag = 0;
newpag = 1;
lineno = 0;
newfile = 0;
plval = PAGELEN;
*headl = '\0';
*headc = '\0';
*headr = '\0';
*footl = '\0';
*footc = '\0';
*footr = '\0';
fill = YES;
lsval = 1;
inval = 0;
rmval = PAGEWIDTH;
tival = 0;
ceval = 0;
outp = -1;
outw = 0;
outwds = 0;
m1val = MARGIN;
m2val = MARGIN;
m3val = MARGIN;
m4val = MARGIN;
bottom = plval - m3val - m4val;
}
command (buf) /* perform formatting command */
char *buf;
{
int ct;
int val;
static char argtyp;
static spval;
if ((ct = comtyp(buf)) == UNKNOWN)
return;
val = getval (buf, &argtyp);
switch (ct) {
case FI:
brk();
fill = YES;
break;
case NF:
brk();
fill = NO;
break;
case BR:
brk();
break;
case LS:
set (&lsval, val, argtyp, 1, 1, HUGE);
break;
case SP:
set (&spval, val, argtyp, 1, 0, HUGE);
space (spval);
break;
case BP:
if (lineno > 0)
space (HUGE);
set (&curpag, val, argtyp, curpag+1, -HUGE, HUGE);
newpag = curpag;
break;
case PL:
set (&plval, val, argtyp, PAGELEN, m1val+m2val+m3val+m4val+1, HUGE);
bottom = plval - m3val - m4val;
break;
case IN:
set (&inval, val, argtyp, 0, 0, rmval - 1);
tival = inval;
break;
case RM:
set (&rmval, val, argtyp, PAGEWIDTH, tival+1, HUGE);
break;
case TI:
set (&tival, val, argtyp, 0, 0, rmval);
break;
case CE:
brk();
set (&ceval, val, argtyp, 1, 0, HUGE);
break;
case HE:
gettl (buf, headl, headc, headr);
break;
case FO:
gettl (buf, footl, footc, footr);
break;
case M1:
set (&m1val, val, argtyp, MARGIN, 0, plval-m2val-m3val-m4val-1);
break;
case M2:
set (&m2val, val, argtyp, MARGIN, 0, plval-m1val-m3val-m4val-1);
break;
case M3:
set (&m3val, val, argtyp, MARGIN, 0, plval-m1val-m2val-m4val-1);
bottom = plval - m3val - m4val;
break;
case M4:
set (&m4val, val, argtyp, MARGIN, 0, plval-m1val-m2val-m3val-1);
bottom = plval - m3val - m4val;
break;
case NE:
brk();
if (val > bottom - lineno + 1)
space (HUGE);
break;
case NX:
if((buf=gettl2(buf,newname)) != NULL) /* skip first slash */
gettl2(buf,newname);
newfile = 1;
break;
}
}
comtyp (buf)
char *buf;
{
static char commands[][3] = {
"fi", "nf", "br", "ls", "bp",
"sp", "in", "rm", "ti", "ce",
"he", "fo", "pl", "m1", "m2",
"m3", "m4", "ne", "nx"
};
char *p;
unsigned i;
for (p=commands, i=1; i <= NCMDS; i++, p+=3)
if (buf[1] == *p && buf[2] == *(p+1))
return (i);
return UNKNOWN;
}
getval (buf, argtyp) /* evaluate optional numeric argument */
char *buf, *argtyp;
{
char *skipb();
buf = skipb (buf + 3);
*argtyp = *buf;
if (*argtyp == '+' || *argtyp == '-')
buf++;
return (atoi(buf));
}
set (param, val, argtyp, defval, minval, maxval)
int *param;
{
switch (argtyp) {
case '\n':
*param = defval;
break;
case '+':
*param += val;
break;
case '-':
*param -= val;
break;
default:
*param = val;
}
*param = min (*param, maxval);
*param = max (*param, minval);
}
put (buf) /* put out line with proper spacing and indenting */
char *buf;
{
unsigned i;
if (lineno == 0 || lineno > bottom)
phead();
for (i = tival; i--;)
putchar (' ');
tival = inval;
fputs (buf, stdout);
skip (min(lsval-1, bottom-lineno));
lineno += lsval;
if (lineno > bottom)
pfoot();
}
phead() /* put out page header */
{
curpag = newpag++;
if (m1val > 0) {
skip (m1val - 1);
puttl (headl, headc, headr, curpag);
}
skip (m2val);
lineno = m1val + m2val + 1;
}
pfoot() /* put out page footer */
{
skip (m3val);
if (m4val > 0) {
puttl (footl, footc, footr, curpag);
skip (m4val - 1);
}
}
puttl (ttll, ttlc, ttlr, pageno) /* put out title line with optional page number */
char *ttll, *ttlc, *ttlr;
{
static char ttlout[MAXLINE];
int len, nchars, shift;
nchars = expand (ttlout, ttll, pageno) + tival;
printf ("%*s", nchars, ttlout);
len = expand (ttlout, ttlc, pageno);
shift = ((rmval + tival - len) >> 1) - nchars;
printf ("%*s", shift+len, ttlout);
nchars += shift + len;
expand (ttlout, ttlr, pageno);
printf ("%*s\n", max(rmval-nchars,0), ttlout);
}
expand (out, in, pageno)
char *out, *in;
{
char *i;
for (i = out; *in; in++)
if (*in == PAGENUM) {
sprintf (i, "%d", pageno);
for (; *i; i++)
;
} else
*i++ = *in;
*i = '\0';
return (strlen(out));
}
gettl (buf, ttll, ttlc, ttlr) /* copy title from buf to ttl */
char *buf, *ttll, *ttlc, *ttlr;
{
if ((buf = gettl2 (buf, ttll)) == NULL)
return;
if ((buf = gettl2 (buf, ttll)) == NULL)
return;
if ((buf = gettl2 (buf, ttlc)) == NULL)
return;
gettl2 (buf, ttlr);
}
gettl2 (buf, ttl)
char *buf, *ttl;
{
for (buf++; *buf != '/'; buf++) {
if (*buf == '\n') {
*ttl = '\0';
return NULL;
}
*ttl++ = *buf;
}
*ttl = '\0';
return buf;
}
space (n) /* space n lines or to bottom of page */
{
brk();
if (lineno > bottom)
return;
if (lineno == 0)
phead();
skip (min(n, bottom+1-lineno));
lineno += n;
if (lineno > bottom)
pfoot();
}
skip (n) /* output n blank lines */
{
int i;
for (i = 1; i <= n; i++)
putchar ('\n');
}
char *skipb (p)
char *p;
{
for (; *p == ' '; p++)
;
return p;
}
SHAR_EOF
fi # end of overwriting check
if test -f 'efmt2.c'
then
echo shar: will not over-write existing file "'efmt2.c'"
else
cat << \SHAR_EOF > 'efmt2.c'
/*
Extended Text Formatter - Part 2
Filename: efmt2.c
History:
07/29/86 - MRR - added #include "efmt.h"
*/
#include <stdio.h>
#include "efmt.h"
extern int
fill, /* fill is YES */
lsval, /* current line spacing */
inval, /* current indent */
rmval, /* current right margin */
tival, /* current temporary indent */
ceval, /* number of lines to center */
curpag, /* current output page number */
newpag, /* next output page number */
lineno, /* next line to be printed */
plval, /* page length in lines */
m1val, /* margin before and including header */
m2val, /* margin after header */
m3val, /* margin after last line */
m4val, /* bottom margin, including footer */
bottom; /* last live line on page, = plval - m3val - m4val */
extern char headl[], headc[], headr[]; /* top of page title */
extern char footl[], footc[], footr[]; /* end of page title */
extern char outbuf[]; /* output buffer */
extern int
outp, /* last char position in outbuf */
outw, /* width of text currently in outbuf */
outwds; /* number of words in outbuf */
text (inbuf) /* process text lines */
char *inbuf;
{
static char wrdbuf[INSIZE];
static char *i;
if (*inbuf == ' ' || *inbuf == '\n')
leadbl (inbuf);
if (ceval > 0) {
center (inbuf);
put (inbuf);
ceval--;
} else if (*inbuf == '\n')
put (inbuf);
else if (fill == NO)
put (inbuf);
else
for (i = inbuf; getwrd (&i,wrdbuf) > 0;)
putwrd (wrdbuf);
}
leadbl (buf) /* delete leading blanks, set tival */
char *buf;
{
char *i, *j;
brk();
for (i = buf; *i == ' '; i++)
;
if (*i != '\n')
tival += (i - buf);
for (j = buf; *i; j++) {
*j = *i;
i++;
}
*j = '\0';
}
putwrd (wrdbuf) /* put a word in outbuf */
char *wrdbuf;
{
int llval, nextra, w, last;
w = width (wrdbuf);
last = strlen (wrdbuf) + outp + 2;
llval = rmval - tival;
if (outp >= 0 && (outw+w > llval || last >= MAXOUT)) {
last -= outp + 1;
nextra = llval - outw + 1;
spread (outbuf, outp, nextra, outwds);
if (nextra > 0 && outwds > 1)
outp += nextra;
brk();
}
strcpy (outbuf+outp+1, wrdbuf);
outp = last - 1;
outbuf[outp] = ' ';
outw += w + 1;
outwds++;
}
width (buf) /* compute width of character string */
char *buf;
{
unsigned wdth;
for (wdth=0; *buf; buf++)
if (*buf != '\n')
wdth++;
return wdth;
}
brk() /* end current filled line */
{
if (outp >= 0) {
outbuf[outp] = '\n';
outbuf[outp+1] = '\0';
put (outbuf);
}
outp = -1;
outw = 0;
outwds = 0;
}
spread (buf, outp, nextra, outwds)
char *buf;
{
static dir = 0;
unsigned i, j, nb, ne, nholes;
if (nextra <= 0 || outwds <= 1)
return;
dir = 1 - dir;
ne = nextra;
nholes = outwds - 1;
i = outp - 1;
j = min (MAXOUT-3, i+ne);
while (i < j) {
buf[j] = buf[i];
if (buf[i] == ' ') {
if (dir == 0)
nb = (ne-1)/nholes + 1;
else
nb = ne / nholes;
ne -= nb;
nholes--;
for (; nb > 0; nb--) {
j--;
buf[j] = ' ';
}
}
i--;
j--;
}
}
center (buf) /* center a line by setting tival */
char *buf;
{
unsigned tmp;
tmp = (rmval + tival - width(buf)) >> 1;
tival = max (tmp, 0);
}
getwrd (in, out)
char **in, *out;
{
char *i, *j;
i = *in;
while (*i == ' ')
i++;
j = out;
while (*i && *i != ' ' && *i != '\n')
*j++ = *i++;
*j = '\0';
*in = i;
return (j - out);
}
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
--
| Mark R. Rinfret, SofTech, Inc. mark@unisec.usi.com |
| Guest of UniSecure Systems, Inc., Newport, RI |
| UUCP: {gatech|mirror|cbosgd|uiucdcs|ihnp4}!rayssd!unisec!mark |
| work: (401)-849-4174 home: (401)-846-7639 |