|
|
researchv10 Norman
/*
* lpd - Printronix line printer daemon dispatcher
*/
#include <ctype.h>
#include <sgtty.h>
#define SPIDER 0
#define PHONE 0
#define LPD 1
#include "daemon.c"
/*
* The remaining part is the line printer interface.
*/
FILE *lpf = NULL;
#define LINESIZE 1000
char buf[LINESIZE], ubuf[LINESIZE];
int ulen, blen;
dem_con()
{
return(0);
}
dem_dis()
{
FCLOSE(lpf);
FCLOSE(dfb);
}
dem_open(file)
char *file;
{
struct sgttyb tb;
static char iobuf[BUFSIZ];
if((lpf = fopen(lp, "w")) == NULL)
trouble("Can't open %s", lp);
if (gtty(fileno(lpf),&tb) < 0)
trouble("Can't do gtty(%s)\n", lp);
tb.sg_ispeed = tb.sg_ospeed = B9600;
tb.sg_flags &= ~ALLDELAY;
tb.sg_flags |= XTABS;
if (stty(fileno(lpf),&tb) < 0)
trouble("Can't do stty(%s)\n", lp);
setbuf (lpf, iobuf);
}
dem_close()
{
dem_dis();
}
get_snumb()
{
}
lwrite()
{
banner(lpf, &line[1]);
}
FILE *ibuf;
enum linemode {normal, large, plot};
sascii(fc)
char fc;
{
register int c, p;
register enum linemode lm;
if((ibuf = fopen(&line[1], "r")) == NULL)
return(0);
if(fc == 'F')
putc(ff, lpf);
clr();
p = 0;
lm = normal;
while ((c = getc (ibuf)) != EOF) {
switch (c) {
case ' ':
++p;
break;
case '\b':
if (p > 0)
--p;
break;
case '\t':
p = (p + 8) & -8;
break;
case '\r':
p = 0;
break;
case '\n':
case '\f':
emit(c, lm);
lm = normal;
clr();
p = 0;
break;
case '\033': /* escape for expand */
lm = large;
break;
case '\005': /* plot mode */
lm = plot;
break;
default:
if (p < LINESIZE) {
if (lm != plot && c == '_') {
ubuf[p++] = c;
if (p > ulen)
ulen = p;
} else {
buf[p++] = c;
if (p > blen)
blen = p;
}
}
break;
}
}
fflush(lpf);
fclose(ibuf);
return(0);
}
etcp1()
{
}
/* VARARGS */
trouble(s, a1, a2, a3, a4)
char *s;
{
if(retcode != 0){
dem_dis();
}
logerr(s, a1, a2, a3, a4);
longjmp(env, 1);
}
/* VARARGS */
logerr(s, a1, a2, a3, a4)
char *s;
int a1, a2, a3, a4;
{
#ifdef DEBUG
fprintf(stderr, s, a1, a2, a3, a4);
putc('\n', stderr);
#endif
}
getowner()
{
}
maildname()
{
fprintf(pmail, "Your %s job for file %s is finished.\n", DAEMNAM, mailfname);
}
clr()
{
register int i;
ulen = blen = 0;
for (i = 0; i < LINESIZE; i++)
buf[i] = ubuf[i] = ' ';
}
emit(c, mode)
register int c;
register enum linemode mode;
{
register int i;
switch (mode) {
case large:
putc ('\b', lpf);
break;
case plot:
putc ('\005', lpf);
while (blen > 0 && (buf[blen-1] & 077) == 0)
--blen;
break;
}
for (i = 0; i < blen; i++)
putc (buf[i], lpf);
if (ulen && mode != plot) {
putc ('\r', lpf);
for (i = 0; i < ulen; i++)
putc (ubuf[i], lpf);
}
putc (c, lpf);
if (ferror (lpf))
trouble ("Output error on %s\n", lp);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.