Article View: net.micro.atari16
Article #955GEM-Kermit (Part 6 of 6)
From: axel
Date: Fri, 20 Jun 1986 03:07
Date: Fri, 20 Jun 1986 03:07
1580 lines
60587 bytes
60587 bytes
#! /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:
# stkrec.c
# stksen.c
# stkutl.c
# stkrsc.uuc
# This archive created: Fri Jun 20 02:38:07 1986
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'stkrec.c'
then
echo shar: "will not over-write existing file 'stkrec.c'"
else
cat << \SHAR_EOF > 'stkrec.c'
/*
* stkrec.c receive file routines for ATARI ST kermit
*/
#include <osbind.h>
#include <stdio.h>
#include "stkobj.h"
#include "stkinc.h"
extern FILE *fopen(),*fopenb();
/*
* r e c s w
*
* This is the state table switcher for receiving files.
*/
recsw()
{
char rinit(), rfile(), rdata(); /* Use these procedures */
start_timer(&starttrans);
state = 'R';
n = 0; /* Initialize message number */
numtry = 0; /* Say no tries yet */
/*
* We are commenting out code that automatically NAKed
* in case the sender started first; this may be the reason
* that this Kermit gets out of whack. The original code
* said
* if (gflg == FALSE)
* spack('N', n, 0, NIL);
*/
for (;;) {
msgdeb(MSGDSTAT,state,n);
bps = ((timer(starttrans) != 0) ?
(bytecnt/timer(starttrans)) : 0);
dt_packets(TRUE);
switch(state) { /* Do until done */
case 'R':
state = rinit(); break; /* Receive-Init */
case 'F':
state = rfile(); break; /* Receive-File */
case 'D':
state = rdata(); break; /* Receive-Data */
case 'C':
return(TRUE); /* Complete state */
case 'A':
spack('E', n, 5, "Abort");
return (FALSE); /* "Abort" */
case 'E':
return(FALSE); /* "Error Abort" */
default:
msgdeb(MSGSTATE);
return (FALSE); /* Unknown, fail */
}
}
}
/*
* r i n i t
*
* Receive Initialization
*/
char rinit()
{
int i, len, num; /* Packet length, number */
char sfile(); /* routine used for get command */
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER); return('A');};
ebq = TRUE; /* assume 7-bit transfer for init */
switch(rpack(&len, &num, packet)) { /* Get a packet */
case 'S': /* Send-Init */
for (i=len;i<10;i++) packet[i] = '\0';
rpar(packet); /* Get the other side's init data */
spar(packet); /* Fill up packet with my init info */
spack('Y', n, 7, packet); /* ACK with my parameters */
oldtry = numtry; /* Save old try count */
numtry = 0; /* Start a new counter */
n = (n + 1) % 64; /* Bump packet number, mod 64 */
n_total++;
return('F'); /* Enter File-Receive state */
case 'E': /* Error packet received */
prerrpkt(packet); /* Print it out and */
return('E'); /* abort */
case FALSE: /* Didn't get packet */
case 'N': /* or got a NAK */
nakcnt++;
if (!getfile)
spack('N', n, 0, NIL); /* Return a NAK */
else
spack('R',n,strlen(filnam1),filnam1);
return(state); /* Keep trying */
case 'Y':
return(state); /* Ignore leftover ACK */
/* (or incorrect ACK of 'R' packet) */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return('A'); /* Some other packet type, "abort" */
}
}
/*
* r f i l e
*
* Receive File Header
*/
char rfile()
{
int num, len; /* Packet number, length */
int f1x, fx; /* index to filnam1 and filnam */
int extx; /* start of extension */
int tryix; /* trying numbers for extension */
char convc; /* converted char in filename */
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER); return('A');};
switch (rpack(&len, &num, packet)) { /* Get a packet */
case 'S': /* Send-Init, maybe our ACK lost */
nakcnt++;
if (oldtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER); return('A');};
if (num != ((n == 0) ? 63 : n - 1))
{msgall(KRPROERR,MSGPROER);
return('A'); /* Not previous packet, "abort" */
};
/* Previous packet, mod 64; ack with our */
/* Send-Init parameters */
spar(packet);
spack('Y', num, 7, packet);
numtry = 0; /* Reset try counter */
return(state); /* Stay in this state */
case 'Z': /* End-Of-File */
nakcnt++;
if (oldtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER); return('A');};
if (num != ((n==0) ? 63:n-1))
{msgall(KRPROERR,MSGPROER);
return('A'); /* Not previous packet, "abort" */
};
spack('Y',num,0,NIL);
numtry = 0;
return(state); /* Stay in this state */
case 'F': /* File Header (just what we want) */
if (num != n)
{msgall(KRPROERR,MSGPROER);
return('A'); /* The packet number must be right */
};
strcpy(filnam1, packet); /* Copy the file name */
/* convert filename to valid TOS file name*/
fx = 0;
extx = -1;
if (filnam[0] == '\0')
{for (f1x = 0; filnam1[f1x] != '\0'; f1x++)
{convc = filnam1[f1x];
if ((convc >= 'a') && (convc <= 'z'))
convc ^= 040;
if (convc == ' ')
convc = '.';
if (!((convc == '.') ||
((convc >= 'A') && (convc <= 'Z')) ||
((convc >= '0') && (convc <= '9'))))
convc = ']';
if (convc == '.')
if (extx >= 0)
convc = ']';
else
extx = fx;
if ((fx < 8) ||
((extx >= 0) &&
((fx - extx) < 4)))
filnam[fx++] = convc;
};
filnam[fx] = '\0';
if (filnamwarn)
{tryix = 0;
while ((!access(filnam,4)) && (tryix < 50))
{msgdeb(MSGERSNA,filnam1,filnam);
if (extx < 0)
{extx = fx;
filnam[fx++] = '.';
filnam[fx] = '\0';
};
sprintf(&filnam[extx+1],"K%02d",tryix++);
};
};
};
/* Try to open a new file */
if (image)
fp = fopenb(filnam,"w");
else
fp = fopen(filnam,"w");
if (fp == NULL) {
msgall(KRWOPERR,MSGWOPER, filnam);
return('A'); /* Give up */
}
/* OK, give message */
msgall(-1,MSGFRASF, filnam1, filnam);
dt_files(TRUE);
spack('Y', n, 0, NIL); /* Acknowledge the file header */
n_total++;
oldtry = numtry; /* Reset try counters */
numtry = 0; /* ... */
n = (n + 1) % 64; /* Bump packet number, mod 64 */
return('D'); /* Switch to Data state */
case 'B': /* Break transmission (EOT) */
if (num != n)
{msgall(KRPROERR,MSGPROER);
return ('A'); /* Need right packet number here */
};
spack('Y', n, 0, NIL); /* Say OK */
n_total++;
return('C'); /* Go to complete state */
case 'E': /* Error packet received */
prerrpkt(packet); /* Print it out and */
return('E'); /* abort */
case FALSE: /* Didn't get packet */
spack('N', n, 0, NIL); /* Return a NAK */
nakcnt++;
return(state); /* Keep trying */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return ('A'); /* Some other packet, "abort" */
}
}
/*
* r d a t a
*
* Receive Data
*/
char rdata()
{
int num, len; /* Packet number, length */
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER); return('A');};
switch (rpack(&len, &num, packet)) { /* Get packet */
case 'D': /* Got Data packet */
if (num != n) { /* Right packet? */
/* No! */
if (num != ((n==0) ? 63:n-1)) /* not prev. packet */
{msgall(KRPROERR,MSGPROER);
return('A');
};
if (oldtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER);
return('A');
};
spack('Y', num, 0, NIL); /* Yes, re-ACK it */
nakcnt++;
numtry = 0; /* Reset try counter */
return(state); /* Don't write data! */
}
/* Got data with right packet number */
#ifdef nooverlap
/* Cannot handle concurrent disk and serial i/o, so delay ACK */
/* until file written */
bufemp(packet, len); /* Write the data to the file */
spack('Y', n, 0, NIL); /* Acknowledge the packet */
#else
/* ACK before file write to overlap disk and serial i/o */
spack('Y', n, 0, NIL); /* Acknowledge the packet */
bufemp(packet, len); /* Write the data to the file */
#endif
oldtry = numtry; /* Reset the try counters */
numtry = 0; /* ... */
n = (n + 1) % 64; /* Bump packet number, mod 64 */
n_total++;
if (ferror(fp))
{msgall(KRFATFER,MSGFATFE);
return('A');
};
return('D'); /* Remain in data state */
case 'F': /* Got a File Header */
if (num != ((n==0) ? 63:n-1)) /* not prev. packet */
{msgall(KRPROERR,MSGPROER);
return('A');
};
if (oldtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER);
return('A');
};
spack('Y', num, 0, NIL); /* ACK it again */
nakcnt++;
numtry = 0; /* Reset try counter */
return(state); /* Stay in Data state */
case 'Z': /* End-Of-File */
if (num != n)
{msgall(KRPROERR,MSGPROER);
return('A'); /* Must have right packet number */
};
if (ferror(fp))
{msgall(KRFATFER,MSGFATFE);
return('A');
};
#ifdef nooverlap
/* can't handle disk and serial i/o at the same time */
fclose(fp); /* close the file */
spack('Y', n, 0, NIL); /* Ack the 'Z' packet */
#else
/* ACK before close to allow i/o overlap */
spack('Y', n, 0, NIL); /* OK, ACK it. */
fclose(fp); /* Close the file */
#endif
n = (n + 1) % 64; /* Bump packet number */
msgall(-1,MSGTREOF,filnam);
n_total++;
filecnt++;
dt_files(TRUE);
filnam[0] = '\0';
return('F'); /* Go back to Receive File state */
case 'E': /* Error packet received */
prerrpkt(packet); /* Print it out and */
return('E'); /* abort */
case FALSE: /* Didn't get packet */
spack('N', n, 0, NIL); /* Return a NAK */
nakcnt++;
return(state); /* Keep trying */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return('A'); /* Some other packet, "abort" */
}
}
SHAR_EOF
fi
if test -f 'stksen.c'
then
echo shar: "will not over-write existing file 'stksen.c'"
else
cat << \SHAR_EOF > 'stksen.c'
/*
* stksen.c send file routines of ATARI ST kermit
*/
#include <osbind.h>
#include <stdio.h>
#include "stkobj.h"
#include "stkinc.h"
extern FILE *fopen(), *fopenb();
/*
* s e n d s w
*
* Sendsw is the state table switcher for sending files. It loops until
* either it finishes, or an error is encountered. The routines called
* by sendsw are responsible for changing the state.
*
*/
sendsw()
{
char sinit(), sfile(), sdata(), seof(), sbreak();
start_timer(&starttrans);
state = 'S'; /* Send initiate is the start state */
n = 0; /* Initialize message number */
numtry = 0; /* Say no tries yet */
for (;;) { /* Do this as long as necessary */
msgdeb(MSGDSTAT,state,n);
bps = ((timer(starttrans) != 0) ?
(bytecnt/timer(starttrans)) : 0);
dt_packets(TRUE);
switch(state) {
case 'S':
state = sinit(); break; /* Send-Init */
case 'F':
state = sfile(); break; /* Send-File */
case 'D':
state = sdata(); break; /* Send-Data */
case 'Z':
state = seof(); break; /* Send-End-of-File */
case 'B':
state = sbreak(); break;/* Send-Break */
case 'C':
return (TRUE); /* Complete */
case 'A':
spack('E', n, 5, "Abort"); /* error packet */
return (FALSE); /* "Abort" */
case 'E':
return(FALSE); /* "Error Abort" */
default:
msgdeb(MSGSTATE);
return (FALSE); /* Unknown, fail */
}
}
}
/*
* s i n i t
*
* Send Initiate: send this host's parameters and get other side's back.
*/
char sinit()
{
int num, len; /* Packet number, length */
int i;
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER); return('A');};
ebq = TRUE; /* assume 7 bit transfer for init */
spar(packet); /* Fill up init info packet */
flushinput(); /* Flush pending input */
spack('S', n, 7, packet); /* Send an S packet */
for (i = 0; i <= 10; i++) recpkt[i] = 0;
switch(rpack(&len, &num, recpkt)) { /* What was the reply? */
case 'N':
nakcnt ++;
return(state); /* NAK, try it again */
case 'Y': /* ACK */
if (n != num) /* If wrong ACK, stay in S state */
{
nakcnt++;
return(state); /* and try again */
};
n_total++;
rpar(recpkt); /* Get other side's init info */
numtry = 0; /* Reset try counter */
n = (n + 1) % 64; /* Bump packet count */
return('F'); /* OK, switch state to F */
case 'E': /* Error packet received */
prerrpkt(recpkt); /* Print it out and */
return('E'); /* abort */
case FALSE:
nakcnt++;
return(state); /* Receive failure, try again */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return('A'); /* Anything else, just "abort" */
}
}
/*
* s f i l e
*
* Send File Header.
*/
char sfile()
{
int num, len; /* Packet number, length */
char *newfilnam, /* Pointer to file name to send */
*cp; /* char pointer */
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER);return('A');};
if (fp == NULL)
{ /* If not already open, */
filnam1[0] = '\0';
dt_files(TRUE);
msgdeb(MSGFOPN,filnam);
/* open the file to be sent */
if (image)
fp = fopenb(filnam,"r");
else
fp = fopen(filnam,"r");
if (fp == NULL)
{ /* bad file pointer, give up */
msgall(KERRFOPN,MSGERRFO);
return('A');
};
};
strcpy(filnam1, filnam); /* Copy file name */
newfilnam = cp = filnam1;
len = strlen(filnam1); /* Compute length of new filename */
spack('F', n, len, newfilnam); /* Send an F packet */
switch(rpack(&len, &num, recpkt)) { /* What was the reply? */
case 'N': /* NAK, just stay in this state, */
num = (--num<0 ? 63:num); /* unless it's NAK for next packet */
if (n != num) /* which is just like an ACK for */
{nakcnt++;return(state);};
case 'Y': /* ACK */
if (n != num)
{
nakcnt++;
return(state); /* and try again */
};
msgall(-1,MSGSFASF,filnam, newfilnam);
dt_files(TRUE);
n_total++;
numtry = 0; /* Reset try counter */
n = (n + 1) % 64; /* Bump packet count */
size = bufill(packet); /* Get first data from file */
return('D'); /* Switch state to D */
case 'E': /* Error packet received */
prerrpkt(recpkt); /* Print it out and */
return('E'); /* abort */
case FALSE:
nakcnt++;
return(state); /* Receive failure, stay in F state */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return('A'); /* Something else, just "abort" */
}
}
/*
* s d a t a
*
* Send File Data
*/
char sdata()
{
int num, len; /* Packet number, length */
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER);return('A');};
spack('D', n, size, packet); /* Send a D packet */
switch (rpack(&len, &num, recpkt)) { /* What was the reply? */
case 'N': /* NAK, just stay in this state, */
num = (--num<0 ? 63:num); /* unless it's next packet's NAK */
if (n != num) /* which is just like an ACK for */
{
nakcnt++;
return(state); /* and try again */
};
case 'Y': /* ACK */
if (n != num)
{
nakcnt++;
return(state); /* and try again */
};
n_total++;
numtry = 0; /* Reset try counter */
n = (n+1)%64; /* Bump packet count */
if ((size = bufill(packet)) == EOF) /* Get data from file */
return('Z'); /* If EOF set state to that */
if (ferror(fp))
{msgall(KRFATFER,MSGFATFE);
return('A');
};
return('D'); /* Got data, stay in state D */
case 'E': /* Error packet received */
prerrpkt(recpkt); /* Print it out and */
return('E'); /* abort */
case FALSE:
nakcnt++;
return(state); /* Receive failure, stay in D */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return('A'); /* Anything else, "abort" */
}
}
/*
* s e o f
*
* Send End-Of-File.
*/
char
seof()
{
int num, len; /* Packet number, length */
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER);return('A');};
spack('Z', n, 0, packet); /* Send a 'Z' packet */
switch(rpack(&len, &num, recpkt)) { /* What was the reply? */
case 'N': /* NAK, just stay in this state, */
num = (--num<0 ? 63:num); /* unless it's next packet's NAK, */
if (n != num) /* which is just like an ACK for */
{
nakcnt++;
return(state); /* and try again */
};
case 'Y': /* ACK */
if (n != num)
{
nakcnt++;
return(state); /* and try again */
};
n_total++;
filecnt++;
numtry = 0; /* Reset try counter */
n = (n+1)%64; /* and bump packet count */
msgall(-1,MSGTREOF,filnam);
fclose(fp); /* Close the input file */
fp = NULL; /* Set flag indicating no file open */
msgdeb(MSGFNEXT);
if (fnxtfil() == FALSE) /* No more files go? */
return('B'); /* if not, break, EOT, all done */
msgdeb(MSGNEWFI,filnam);
return('F'); /* More files, switch state to F */
case 'E': /* Error packet received */
prerrpkt(recpkt); /* Print it out and */
return('E'); /* abort */
case FALSE:
nakcnt++;
return(state); /* Receive failure, stay in Z */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return('A'); /* Something else, "abort" */
}
}
/*
* s b r e a k
*
* Send Break (EOT)
*/
char sbreak()
{
int num, len; /* Packet number, length */
if (numtry++ > maxtry)
{msgall(KRTRAERR,MSGTRAER);return('A');};
spack('B', n, 0, packet); /* Send a B packet */
switch (rpack(&len, &num, recpkt)) { /* What was the reply? */
case 'N':
/* NAK, just stay in this state, */
num = (--num<0 ? 63:num); /* unless previous packet's NAK, */
if (n != num) /* which is just like an ACK for */
{
nakcnt++;
return(state); /* and try again */
};
case 'Y': /* ACK */
if (n != num)
{
nakcnt++;
return(state); /* and try again */
};
n_total++;
numtry = 0; /* Reset try counter */
n = (n+1)%64; /* and bump packet count */
return('C'); /* Switch state to Complete */
case 'E': /* Error packet received */
prerrpkt(recpkt); /* Print it out and */
return('E'); /* abort */
case FALSE:
nakcnt++;
return(state); /* Receive failure, stay in B */
case 'A':
return('A'); /* user abort */
default:
msgall(KRPROERR,MSGPROER);
return ('A'); /* Other, "abort" */
}
}
SHAR_EOF
fi
if test -f 'stkutl.c'
then
echo shar: "will not over-write existing file 'stkutl.c'"
else
cat << \SHAR_EOF > 'stkutl.c'
/*
* stkutl.c Packet handling and misc. routines for ATARI ST kermit
*/
#include <osbind.h>
#include <stdio.h>
#include "stkinc.h"
#include "stkobj.h"
extern *msg_string();
/*
* KERMIT utilities.
*/
/*
* s p a c k
*
* Send a Packet
*/
spack(type,num,len,data)
char type, *data;
int num, len;
{
int i; /* Character loop counter */
char chksum, buffer[100]; /* Checksum, packet buffer */
register char *bufp; /* Buffer pointer */
if (ibmmode)
wait_handshake(); /* if ibm mode wait for handshake */
if(type != 'Y' && type != 'N')
flushinput(); /* dump any leftovers */
len=len & 0x7f; /* Make sure len is not > 127 */
if (len > MAXPACKSIZ ) /* Make sure not larger than buffer */
len = MAXPACKSIZ-4; /* IF so limit it */
msgdeb(MSGTLNPS,type,len,num);
/* Display outgoing packet */
if (data != NIL)
data[len] = '\0'; /* Null-terminate data to print it */
if (data != NIL)
msgdeb(MSGDATPS,data);
bufp = buffer; /* Set up buffer pointer */
if (padding) /* Do padding */
for (i=1; i<=spad; i++)
Cauxout(spadc);
if (debug && (debug > 1)) msgdeb(MSGCHPAD,spad,spadc);
*bufp++ = spcks; /* Packet marker, usally SOH */
*bufp++ = tochar(len+3); /* Send the character count */
chksum = tochar(len+3); /* Initialize the checksum */
*bufp++ = tochar(num); /* Packet number */
chksum += tochar(num); /* Update checksum */
*bufp++ = type; /* Packet type */
chksum += type; /* Update checksum */
for (i=0; i<len; i++) /* Loop for all data characters */
{
*bufp++ = data[i]; /* Get a character */
chksum += data[i]; /* Update checksum */
}
chksum = (((chksum&0300) >> 6)+chksum)&077; /* Compute final checksum */
*bufp++ = tochar(chksum); /* Put it in the packet */
*bufp++ = seol; /* Extra-packet line terminator */
*bufp = '\0';
auxsend(buffer); /* Send the packet */
return(TRUE);
}
/*
* r p a c k
*
* Read a Packet
*/
char rpack(len,num,data)
int *len, *num; /* Packet length, number */
char *data; /* Packet data */
{
int i,j, eolwc, done; /* Data character number, loop exit */
int read_abort; /* 0 = timeout, 'A' = abort requested */
int abort; /* restart current packet */
char t, /* Current input character */
type, /* Packet type */
cchksum, /* Our (computed) checksum */
rchksum; /* Checksum received from other host */
start_timer(&startpckt);
if (testat(&read_abort)) return(read_abort);
do {
if (readtimed(&t,&read_abort)) return(read_abort);
}
while ((t&127) != rpcks); /* Wait for packet header */
done = FALSE; /* Got SOH, init loop */
while (!done) /* Loop to get a packet */
{
if(readtimed(&t,&read_abort))
return(read_abort); /* read character, or timeout */
/* if (!image) I guess, that's nonsense! */
t &= 0177; /* Handle parity */
if (t == rpcks) continue; /* Resynchronize if SOH */
cchksum = t; /* Start the checksum */
*len = unchar(t)-3; /* Character count */
if(readtimed(&t, &read_abort))
return(read_abort); /* read character, or timeout */
/* if (!image) nonsense ? */
t &= 0177; /* Handle parity */
if (t == rpcks) continue; /* Resynchronize if SOH */
cchksum = cchksum + t; /* Update checksum */
*num = unchar(t); /* Packet number */
if(readtimed(&t, &read_abort))
return(read_abort); /* read character, or timeout */
/* if (!image) nonsense ? */
t &= 0177; /* Handle parity */
if (t == rpcks) continue; /* Resynchronize if SOH */
cchksum = cchksum + t; /* Update checksum */
type = t; /* Packet type */
abort=FALSE;
for (i=0; i<*len; i++) /* The data itself, if any */
{ /* Loop for character count */
if(readtimed(&t, &read_abort))
return(read_abort); /* read character, or timeout */
if (!image || ebq)
t &= 0177; /* Handle parity */
if (t == rpcks) { /* Resynch if SOH */
abort=TRUE;
break;
}
cchksum = cchksum + t; /* Update checksum */
data[i] = t; /* Put it in the data buffer */
}
if(abort)continue;
data[*len] = 0; /* Mark the end of the data */
if(readtimed(&t, &read_abort))
return(read_abort); /* read character, or timeout */
t &= 0177; /* do not use parity bit of checksum */
rchksum = unchar(t); /* Convert to numeric */
if (t == rpcks) continue; /* Resynchronize if SOH */
done = TRUE; /* Got checksum, done */
}
if (data != NIL)
data[*len] = '\0'; /* Null-terminate data to print it */
msgdeb(MSGTLNPR,type,*len,*num);
if (data != NIL)
msgdeb(MSGDATPR,data);
/* Fold in bits 7,8 to compute */
cchksum = (((cchksum&0300) >> 6)+cchksum)&077; /* final checksum */
if (cchksum != rchksum)
{
msgdeb(MSGCHKERR,rchksum,cchksum);
return(FALSE);
}
/* wait for eol to avoid lost packages */
for (eolwc=0; eolwc<100; eolwc++)
if (Cauxis())
break;
else
evnt_timer(1,0);
return(type); /* All OK, return packet type */
}
/*
* compute 'universal time'
*/
long univ_time(t)
int t;
{
long int res;
res = 60 * ((t >> 11) & 0x1FL);
res = 60 * (res + ((t >> 5) & 0x3FL));
res = res + ((t & 0x1FL) << 1);
return (res);
}
/*
* start timer
*/
start_timer(t0)
long int *t0;
{*t0 = univ_time(Tgettime());
}
/*
* compute difference to start time
*/
int timer(t0)
long int t0;
{long int t1;
t1 = univ_time(Tgettime());
if (t1 < t0)
return ((int) (t1+(24*60*69)-t0));
else
return ((int) max((t1 - t0),1));
}
/* readtimed: read a character or timeout
* timeout is relative to start of waiting for packet
*/
readtimed(c,flag)
char *c; /* character received */
int *flag; /* flag showing reason for abort: 0=timeout,'A'=user aborted */
{
while(!Cauxis())
{
*flag = sleepwait(50);
if (*flag == 'A') /* abort requested */
{
msgdeb(MSGUSRABO);
return(TRUE);
};
if (state == 'W')
start_timer(&startpckt); /* no timeout in server wait */
if ((*flag == 'T') ||
(stimint && dotimout && (timer(startpckt) >= stimint)))
{
msgdeb(MSGTIMOUT);
timcnt += 1;
*flag = 0;
return(TRUE);
};
};
*c = Cauxin();
if (debug && (deblevel > 1)) msgdeb(MSGCHRD,timer(startpckt),*c,(*c & 0x7F));
return(FALSE);
}
/*
* test for abort or timeout request
*/
int testat(flag)
int *flag;
{
*flag = sleepwait(0);
if (*flag == 'A') /* abort requested */
{
msgdeb(MSGUSRABO);
return(TRUE);
};
if (*flag == 'T')
{
msgdeb(MSGTIMOUT);
timcnt += 1;
*flag = FALSE;
return(TRUE);
};
return(FALSE);
}
/*
* b u f i l l
*
* Get a bufferful of data from the file that's being sent.
* Only control-quoting is done; 8-bit & repeat count prefixes are
* not handled.
*/
bufill(buffer)
char buffer[]; /* Buffer */
{
int i, /* Loop index */
t; /* Char read from file */
char t7; /* 7-bit version of above */
char t9; /* dup of data char t */
char b8; /* 8th bit */
i = 0; /* Init data buffer pointer */
while(TRUE)
{
t = getc(fp); /* Get the next character */
bytecnt++;
if (feof(fp)) break;
t9=t; /* Keep original pattern */
t7 = t & 0177; /* Get low order 7 bits */
b8 = t & 0200; /* Get MSB */
if (ebq && b8 && image)
buffer[i++] = ebq;
if ((t7 < SP) || (t7==DEL) || (t7==squote)
|| ((t7 == ebq) && ebq))
/* Does this char require */
{ /* special handling? */
if (t=='\n' && !image)
{ /* Do LF->CRLF mapping if !image */
buffer[i++] = squote;
buffer[i++] = ctl('\r');
}
buffer[i++] = squote; /* Quote the character */
if ((t7 != squote) && ((t7 != ebq) || !ebq))
{
t = ctl(t); /* and uncontrolify */
t7 = ctl(t7);
};
};
if (image && !ebq)
buffer[i++] = t; /* Deposit the character itself */
else
buffer[i++] = t7;
if (i >= spsiz-8) return(i); /* Check length */
}
if (i==0) return(EOF); /* Wind up here only on EOF */
return(i); /* Handle partial buffer */
}
/*
* b u f e m p
*
* Put data from an incoming packet into a file.
*/
bufemp(buffer,len)
char buffer[]; /* Buffer */
int len; /* Length */
{
int i; /* Counter */
char t; /* Character holder */
int b8; /* 8th bit flag */
for (i=0; i<len; i++) /* Loop thru the data field */
{
b8 = FALSE;
t = buffer[i]; /* Get character */
if (ebq && image && (ebq == t))
{b8 = TRUE; t = buffer[++i];
};
if (t == rquote) /* Control quote? */
{
t = buffer[++i]; /* Get the quoted character */
if ((t & 0177) != rquote) /* Low order bits match quote char? */
t = ctl(t); /* No, uncontrollify it */
};
if (b8) t |= 0200;
putc(t,fp);
bytecnt++;
};
}
/*
* s p a r
*
* Fill the data array with my send-init parameters
*
*/
spar(data)
char data[];
{
data[0] = tochar(rpsiz); /* Biggest packet I can receive */
data[1] = tochar(rtimint); /* When I want to be timed out */
data[2] = tochar(MYPAD); /* How much padding I need */
data[3] = ctl(MYPCHAR); /* Padding character I want */
data[4] = tochar(reol); /* End-Of-Line character I want */
data[5] = squote; /* Control-Quote character I send */
data[6] = (image ? MYEBQ : MYNOEBQ); /* 8 bit quoting */
}
/* r p a r
*
* Get the other host's send-init parameters
*
*/
rpar(data)
char data[];
{ if((data[0]) != 0)
spsiz = unchar(data[0]); /* Maximum send packet size */
if (data[1] != 0)
stimint = unchar(data[1]); /* When I should time out */
if (data[2] != 0)
padding = spad = unchar(data[2]); /* Number of pads to send */
else
padding = spad = 0;
spadc = ctl(data[3]); /* Padding character to send */
if ((data[4]) != 0)
seol = unchar(data[4]); /* EOL character I must send */
else
seol = MYEOL;
if (data[5] != 0)
rquote = data[5]; /* Incoming data quote character */
else
rquote = MYQUOTE;
if (!image || (data[6] == 0) || (data[6] == 'N') || (data[6] == 'Y'))
ebq = FALSE;
else
ebq = data[6];
}
/*
* f l u s h i n p u t
*
* Dump all pending input to clear stacked up NACK's.
*/
flushinput()
{char c;
/* TOS Clear AUX receive buffer */
while (Cauxis())
{c = Cauxin();
if (debug && (deblevel > 1))
msgdeb(MSGCHFLU,c,(c & 0x7F));
};
}
/*
* send one string to the aux port
*/
auxsend(str)
char *str;
{
while (*str != '\0')
{if (debug && (deblevel > 1)) msgdeb(MSGCHSND,*str,(*str & 0x7F));
Cauxout(*str++);
};
}
/*
* wait for handshake character
*/
wait_handshake()
/*
* wait for turnchar
* if received wait another 100 msecs and if no char received return.
* if no char received within 1000 msecs assume we missed turnchar
* otherwise return after a maximum of 4 secs
*/
{
int waitc; /* wait counter */
char c; /* last char read */
int nochrec; /* no char received */
long int starthw; /* start time for wait */
waitc = 0;
start_timer(&starthw);
while (TRUE)
{if (timer(starthw) >= 4) break;
if ((waitc >= 10) && !Cauxis()) break;
if (Cauxis())
{waitc = 0;
while (Cauxis())
{c = Cauxin() & 0x7F;
if (debug && (deblevel > 1)) msgdeb(MSGCHWHC,c,c);
};
};
evnt_timer(100,0);
if ((c == rturnchar) && !Cauxis())
{msgdeb(MSGHNDOK);
return(FALSE);
};
waitc++;
};
msgdeb(MEGHNDFA);
return(FALSE);
}
/*
* Kermit printing routines:
*
*/
/*
* Print message on DEBUG file
* First arg is object index of the KRMESSS object
*/
msgdeb(fmtix, a1, a2, a3, a4, a5)
int fmtix;
long a1,a2,a3,a4,a5;
{
if (debug)
{
fprintf(deb,msg_string(fmtix),a1,a2,a3,a4,a5);
putc('\n',deb);
};
}
/*
* Print message on LOG file
* if first arg >= 0 then display an alert box too
*/
msglog(alertix,fmtix,a1,a2,a3,a4,a5)
int fmtix, alertix;
long a1, a2, a3, a4, a5;
{
if (translog)
{
fprintf(log,msg_string(fmtix),a1,a2,a3,a4,a5);
putc('\n',log);
};
if (alertix >= 0)
displ_alert(1,alertix);
}
/*
* Print message on DEBUG and LOG file
* and perhaps display an alert box
*/
msgall(alertix,fmtix,a1,a2,a3,a4,a5)
int fmtix, alertix;
{
msgdeb(fmtix,a1,a2,a3,a4,a5);
msglog(alertix,fmtix,a1,a2,a3,a4,a5);
}
/*
* p r e r r p k t
*
* Print contents of error packet received from remote host.
*/
prerrpkt(msg)
char *msg;
{
msgall(-1,MSGERRPK,msg);
displ_pckerr(msg);
}
SHAR_EOF
fi
if test -f 'stkrsc.uuc'
then
echo shar: "will not over-write existing file 'stkrsc.uuc'"
else
cat << \SHAR_EOF > 'stkrsc.uuc'
begin 777 stkobj.rsc
M <8A36%-84UA1^ "04?@ ,*( V 4 $4 !8 ##R($1E<VLM26YF
M;R ($1A=&5I( @5')A;G-F97(@ "!/<'1I;VYE;B ("!+15)-250M26YF
M;P M+2TM+2TM+2TM+2TM+2TM+2TM+0 @($1E<VL@06-C97-S;W)Y(#$@( @
M($1E<VL@06-C97-S;W)Y(#(@( @($1E<VL@06-C97-S;W)Y(#,@( @($1E
M<VL@06-C97-S;W)Y(#0@( @($1E<VL@06-C97-S;W)Y(#4@( @($1E<VL@
M06-C97-S;W)Y(#8@( @($R4<V-H96XN+BX ("!5;6)E;F5N;F5N+BXN " @
M16YD90 M+2TM+2TM+2TM+2TM+2TM+2T ("!!;GIE:6=E;BXN+@ @($9R96EE
M<B!0;&%T>BXN+@ @(%-E;F1E+BXN " @16UP9F%N9V4N+BX ("!396YD92]3
M97)V97(N+BX +2TM+2TM+2TM+2TM+2TM+2TM+0 @($5M<&9A;F=E+U-E<G9E
M<BXN " @16YD92]397)V97( ("!,;V=O=70O4V5R=F5R "TM+2TM+2TM+2TM
M+2TM+2TM+2T ("!":6Z$<B":8F5R=')A9W5N9P @(%-E<W-I;VXM4')O=&]K
M;VQL+BXN "TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM " @1&5B=6<M4')O
M=&]K;VQL+BXN " @6G5S=&%N9"!R971T96XN+BX +2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2T ("!$871E:6YA;65N()IB97)W86-H=6YG " @4&%D9&EN
M9P @($E"32!-;V1U<P @(%!A<F%M971E<B"$;F1E<FXN+BX ("!:=7-T86YD
M(&QA9&5N+BXN " @6F5I=(%B97)W86-H=6YG $R4<V-H96X@9&5R($1A=&5I
M("XN+@!5;6)E;FYE;B!D97(@1&%T96D@+BXN $YE=65R($YA;64@+BXN $M%
M4DU)5"!+;VUM=6YI:V%T:6]N<W!A<F%M971E<@ %-E;F1E;@ $5M<&9A
M;F=E;@ %!A:V5T;(1N9V4 !?7P!?7P Y.0!?7P!?7P Y.0!787)T97IE
M:70H4V5K+BD !?7P!?7P Y.0!?7P!?7P Y.0!7:65D97)H;VQU;F=E;@
M %]? %]? #DY %IE:6QE;F5N9&4H2&5X8V]D92D !?7P!?7P!.3@!?7P!?
M7P!.3@!0861D:6YG*$AE>&-O9&4I 7U\ 7U\ 3DX 4&%D9&EN9RA,A&YG
M92D !?7P!?7P Y.0!086-K971S=&%R="A(97AC;V1E*0 %]? %]? $Y.
M %]? %]? $Y. $AA;F1S:&%K92A(97AC;V1E*0 %]? %]? $Y. %%U;W1E
M*%IE:6-H96XI 7P!? %@ 7P!? %@ 3TL 04)"4E5#2 !396YD96X !%
M;7!F86YG96X !?7U]?7U]?7U]?7U]?7U]?7U]?7U\ 7U]?7U]?7U]?7U]?
M7U]?7U]?7U]? %A86%A86%A86%A86%A86%A86%A86 !$871E:3H !?7U]?
M7U]?7U]?7U]?7U]?7U]?7U\ 7U]?7U]?7U]?7U]?7U]?7U]?7U]? %A86%A8
M6%A86%A86%A86%A86%A86 "!8BX@3F%M93H !?7U]?7U]? %]?7U]?7U\
M6%A86%A86 !$871E:65N((%B97)T<F%G96XZ 7U]?7U\ 7U]?7U\ 6%A8
M6%@ 0GET97,O4V5K+CH !?7U]?7P!?7U]?7P!86%A86 !&96AL97)H869T
M92!086ME=&4Z 7U]?7U\ 7U]?7U\ 6%A86%@ 6F5I=(%B97)S8VAR96ET
M=6YG96XZ 7U]?7U]?7P!?7U]?7U]? %A86%A86%@ 0GET97,@(""!8F5R
M=')A9V5N.@ %]? %]? %A8 %!A:V5T($ED96YT:69I:V%T;W(Z 04)"
M4E5#2 !?7U]?7U]? %]?7U]?7U\ 6%A86%A86 !086ME=&4@((%B97)T<F%G
M96XZ 16UP9F%N9V5N+U-E<G9E<@ %-E;F1E;B]397)V97( !:14E4
M($%54P!&15)424< 16YD92]397)V97( !,;V=O=70O4V5R=F5R
M3TL 3D5"14Q 1$(P5%5),3$N0DE43D54 0F5R;FAA<F0@3F5B96P .
M#R!'14TM2T5234E4 >'AX> !697)S:6]N7U\N7U\ .3DY.0!X>'AX>'@
M7U\M7U\M7U\ .3DY.3DY $1I97-E<R!0<F]G<F%M;2!I<W0@4'5B;&EC($1O
M;6%I;@ %-O9G1W87)E('5N9"!W:7)D(&MO<W1E;FQO<R!V97)T96EL="X
M !$87,@0V]P>7)I9VAT(&:!<B!D87,@2T5234E4(%!R;W1O:V]L; &QI
M96=T(&)E:2!D97(@0V]L=6UB:6$@56YI=F5R<VET>2X !$97(@86YD97)E
M(%)E8VAN97(@:&%T(&1E;B!4<F%N<V9E<B!M:70 !F;VQG96YD97(@365L
M9'5N9R!A8F=E8G)O8VAE;CH !?7U]?7U]?7U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U]?7U]? %]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U\ 6%A86%A86%A86%A86%A86%A86%A86%A86%A86%A8
M6%A86%A86%A86 !/2P!!;GIE:6=E;B!D97(@1&%T96D@+BXN "TM+2!-14A2
M("TM+0 M+2T@14Y$12 M+2T 0F5G:6YN(&1E<R!396YD96YS+B!09F%D/2<E
M<R<L1&%T96D])R5S)P!396YD96X@97)F;VQG<F5I8V@@8F5E;F1E="X *BHJ
M17,@9VEB="!K96EN92!S;VQC:&4@1&%T96DA "HJ*D9E:&QE<FUE;&1U;F<@
M=F]M(&%N9&5R96X@4F5C:&YE<CH@)7, 4V5N9&5N(&%B9V5B<F]C:&5N+@!3
M4$%#2SH@='EP93TE8RP@;&5N/24R9"P@;G5M/24P,G@ 4U!!0TLZ(&1A=&$]
M?"5S? J*BI#:&5C:W-U;2!&96AL97(Z(&5M<&8N/24P,G@@97)W+CTE,#)X
M "HJ*D)E;G5T>F5R(&AA="!A8F=E8G)O8VAE;B$ 5&EM96]U="!B96EM($5M
M<&9A;F=E;BX 4U=)5$-(.B!S=&%T93TE8R!N=6T])3 R> J*BI$97(@86YD
M97)E(%)E8VAN97(@86YT=V]R=&5T(&YI8VAT(0 J*BI:=7-T86YD<V9E:&QE
M<@!$871E:2 G)7,G(&:!<B=S(%-E;F1E;B!G991F9FYE="X *BHJ1&%T96D@
M:V%N;B!N:6-H="!G991F9FYE="!W97)D96XN $1A=&5I("<E<R<@=VER9"!A
M;',@)R5S)R!G97-E;F1E="X 1&%T96D@)R5S)R!W=7)D92!V;VQL<W2$;F1I
M9R"!8F5R=')A9V5N+@!24$%#2SH@='EP93TE8RP@;&5N/24R9"P@;G5M/24P
M,G@ 4E!!0TLZ(&1A=&$]?"5S? !3=6-H92!N86-H(&Z$8VAS=&5R($1A=&5I
M("XN+@!.A&-H<W1E($1A=&5I(&ES=" G)7,G+@ J*BI&871A;&5R(%!R;W1O
M:V]L;&9E:&QE<BX *BHJ1&%T96D@)R5S)R!K86YN(&YI8VAT(&5R>F5U9W0@
M=V5R9&5N+@!$871E:2 G)7,G(&5X:7-T:65R="X@3F5U97(@3F%M93H@)R5S
M)RX 16UP9F%N9V5N(&5R9F]L9W)E:6-H(&)E96YD970N "HJ*D9A=&%L97(@
M1&%T96EF96AL97(N $1A=&5I("<E<R<@=VER9"!A;',@)R5S)R!E;7!F86YG
M96XN " @+3X@9V5S96YD970Z(#PP>"4P,G@^('PE8WP 2V5I;B!(86YD<VAA
M:V4@6F5I8VAE;B!E;7!F86YG96XN " @+3X@=65B97)L97-E;CH@/#!X)3 R
M>#X@?"5C? !"96=I;FX@9&5S($5M<&9A;F<N(%!F860])R5S)RQ$871E:3TG
M)7,G $5M<&9A;F=E;B!A8F=E8G)O8VAE;BX (" M/B!N86-H("5D('-E8RXZ
M(#PP>"4P,G@^('PE8WP (" M/B!P861D:6YG.B E9" J(#PP>"4P,G@^ " @
M+3X@:&%N9'-H86ME('=A<G1E;CH@/#!X)3 R>#X@?"5C? @("T^($AA;F1S
M:&%K92!:96EC:&5N(&5M<&9A;F=E;BX ($1A=&5I("5S(&%N9V5F;W)D97)T
M("A09F%D/25S+$1A=&5I/25S*0!%;7!F86YG96XH4V5R=F5R*2!E<F9O;&=R
M96EC:"!B965N9&5T+@!%;F1E*%-E<G9E<BD@86YG969O<F1E<G0N $5M<&9A
M;F=E;BA397)V97(I(&%B9V5B<F]C:&5N+@!35%))3D< 16YD92A397)V97(I
M('=E9V5N($9E:&QE<B!A8F=E8G)O8VAE;BX 3&]G;W5T*%-E<G9E<BD@86YG
M969O<F1E<G0N $5N9&4H4V5R=F5R*2!E<F9O;&=R96EC:"!D=7)C:&=E9H%H
M<G0N $QO9V]U="A397)V97(I(&5R9F]L9W)E:6-H(&)E96YD970N $QO9V]U
M="A397)V97(I('=E9V5N($9E:&QE<B!A8F=E8G)O8VAE;BX 6G5S=&%N9"!R
M971T96X@+BXN %IU<W1A;F0@<F5S=&%U<FEE<F5N("XN+@!396YD96X@+BXN
M $5M<&9A;F=E;B N+BX 4V5N9&5N(&UI="!397)V97)F=6YK=&EO;B N+BX
M16UP9F%N9V5N(&UI="!397)V97)F=6YK=&EO;B N+BX F69F;F5N(&5I;F5S
M($1E8G5G+5!R;W1O:V]L;',@+BXN )EF9FYE;B!E:6YE<R!4<F%N<V%K=&EO
M;G,M4')O=&]K;VQL<R N+BX 00!%<R!G:6)T(&YO8V@@9F]L9V5N9&5N(%!L
M871Z(&%U9B!?.@!& %]?7U]?7U]? %]?7U]?7U]?($)Y=&5S #DY.3DY.3DY
M $]+ $5M<&9A;F=E;B]397)V97( !?7U]?7U]?7U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U]?7U]? %]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?7U]?
M7U]?7U]?7U]?7U]?7U\ 6%A86%A86%A86%A86%A86%A86%A86%A86%A86%A8
M6%A86%A86%A86 !&;VQG96YD92!$871E:2!S;VQL(&%N9V5F;W)D97)T('=E
M<F1E;CH !/2P!!0D)254-( %LS75M&96AL97(@8F5I;2!38VAR96EB96Y\
M9&5R(%!A<F%M971E<F1A=&5I75M!0D)254-(70!;,UU;16EN92!$871E:2!M
M:70@9&EE<V5M?$YA;65N(&=I8G0@97,@8F5R96ET<UU;04)"4E5#2%T 6S-=
M6T5I;F4@1&%T96D@;6ET(&1I97-E;7Q.86UE;B!G:6)T(&5S(&YI8VAT75M!
M0D)254-(70!;,UU;1&EE<V4@1G5N:W1I;VX@:7-T(&YO8VA\;FEC:'0@:6UP
M;&5M96YT:65R=%U;5'-C:'5L9&EG=6YG70!;,%U;1&%T96D@=W5R9&5\=6UB
M96YA;FYT75M/2UT 6S!=6T1A=&5I('=U<F1E?&=E;)1S8VAT75M/2UT 6S-=
M6T9E:&QE<B!B96EM($R4+7QS8VAE;B!D97(@1&%T96E=6T%"0E)50TA= %LS
M75M&96AL97(@8F5I;2!5;2U\8F5N;F5N(&1E<B!$871E:5U;04)"4E5#2%T
M6S-=6T1E<B!A;F1E<F4@4F5C:&YE<GQA;G1W;W)T970@;FEC:'1=6T%"0E)5
M0TA= %LP75M$14)51R!0<F]T;VMO;&Q\86)G97-C:&QO<W-E;EU;3TM= %LP
M75M4<F%N<V%K=&EO;G,@4')O=&\M?&MO;&P@86)G97-C:&QO<W-E;EU;3TM=
M %LS75M&96AL97(@8F5I;2"99F9N96Y\9&5R($1A=&5I75M!0D)254-(70!;
M,%U;6G5S=&%N9"!I<W1\9V5R971T971=6T]+70!;,EU;4V]L;"!D97(@5')A
M;G-F97(@=VER:RU\;&EC:"!A8F=E8G)O8VAE;B!W97)D96X_75M714E415)\
M04)"4E5#2%T 6S!=6UIU<W1A;F0@:7-T?')E<W1A=7)I97)T75M/2UT 6S!=
M6T1A<R!$14)51R!0<F]T;VMO;&P@=W5R9&5\8F5G;VYN96XN(%=I92!S;VQL
M('!R;W1O+7QK;VQI97)T('=E<F1E;C]=6W!A:V5T=V5I<V5\>F5I8VAE;G=E
M:7-E70!;,%U;5')A;G-A:W1I;VYS(%!R;RU\=&]K;VQL(&)E9V]N;F5N75M/
M2UT 6S-=6T9A=&%L97(@1F5H;&5R?&EM(%!R;W1O:V]L;%U;04)"4E5#2%T
M6S-=6T1I92!$871E:2!K86YN(&YI8VAT?&5R>F5U9W0@=V5R9&5N75M!0D)2
M54-(70!;,UU;1F%T86QE<B!$871E:2U\22]/($9E:&QE<EU;04)"4E5#2%T
M6S-=6T)E96YD96X@9&5S(%-E<G9E<G!R;V=R86UM<R!W96=E;GR:8F5R=')A
M9W5N9W-F96AL97)N(&%B9V5B<F]C:&5N+EU;04)"4E5#2%T 6S-=6TQO9V]U
M="!D97,@4V5R=F5R<')O>F5S<V5S('=E9V5N?)IB97)T<F%G=6YG<V9E:&QE
M<FX@86)G96)R;V-H96XN75M!0D)254-(70 ! 2 020 $(, !"[ 0
M^@ $1D !$W 190 $90 !'% 1[ $AP !)' 290 $JL !+,
M 3+@ $UD !.# 3M0 $]T !0N "^P QH ,; , !@ "$8
M /_^ !\ 0 QP ,C #) # 8 A& #__P ' $ ,E #+P
M S P & 1@ __\ "@ ! #,0 SP ,] , !@ $8 /__ L
M 0 SX -! #1 # 8 !& # , -' #2@ TT P &
M 1@ P # #4 V -A , !@ $8 /__ ! 0 V(
M -E #: # 8 !& # , -K #;@ W$ P & 1@
M P # #= X, .$ , !@ $8 /__ \ 0 X4 .( #
MBP # 8 !& # , .. #H@ Z, P & 1@ __\ % !
M #I Z< .J , !@ $8 , P ZT .P #LP # 8
M !& # , .V #QP \@ P & 1@ __\ $0 ! #R0
M \P // , !@ $8 , P ]( /A #X@ # 8 !& #_
M_P / $ /C #Y@ ^D P & 1@ P # #[ ! $ 0"
M , !@ $8 /__ !4 0 ! , 0& $"0 # 8 !& # ,
M 0, $#P !!( P & 1@ P # $%0 !"@ 0I , !@
M$8 /__ !, 0 !"H 0M $, # 8 !& # , 0S $
M0@ !$, P & 1@ __\ #P ! $1 !$8 1( , !@ $8
M ( @ !$H 1, $3@ # 8 !& " ( 1; $8@ !&,
M P & (1@ __X !P ! $9 !&X 1O , !@ "$8 /_^ H 0
M!' 2& $G # 8 1& #__P 6 !8 2R $N0 !+H P & 1
M@ __\ !P ! $NP !-$ 3G , !@ !$8 /__ !8 %@ !/T 4'
M %" # 8 !& #__P * $ 4) %$0 !1D P & $1@ __\
M" ( %(0 !34 4V , !@ $8 /__ !0 0 !3< 4] %0P #
M 8 1& #__P & 8 5) %50 !58 P & 1@ __\ # ! %
M5P !5T 5C , !@ !$8 /__ 8 !@ !6D 5] %?@ # 8 !&
M #__P 4 $ 5_ %A0 !8L P & $1@ __\ !@ & %D0 !:<
M 6H , !@ $8 /__ !8 0 !:D 6Q %N0 # 8 1& #__P (
M @ 7! %U0 !=8 P & 1@ __\ % ! %UP !=H 7= ,
M!@ $8 /__ , P !> 7U %]@ # 8 !& #__P 5 $ 7_
M &!P !@\ P & $1@ __\ " ( &%P !BL 8L , !@ $8
M /__ !0 0 !BT 8^ &/P # 8 A& #__@ 1 $ 9 &3@
M!D\ P & (1@ __X #@ ! &8 !FP 9M , !@ "$8 /_^ P
M 0 !FX 9\ &?0 # 8 A& #__@ . $ 9^ &?P !H P &
M 1@ __\ 0 ! &A !IH :; 4 !@ "$8 /__ !8 0 !IP
M :K &K % 8 A& #__P / $ :M &NP !KP P & (0<
M__\ #@ ! &O0 !L( ;/ , !@ "$8 /__ 4 #0 !M0 ;; &
MY # 8 A& #__P ' D ;K '#0 !PX !0 & 1@ __\ (@ !
M '#P !S4 <V 4 !@ $8 /__ "8 0 !S< => '7P % 8
M !& #__P G $ =@ '@P !X0 !0 & 1@ __\ (P ! 'A0
M!ZT >N , !@ $8 /__ "@ 0 !Z\ ?. 'SP # 8 !& #_
M_P ? $ ?0 'T0 !]( P & 1@ __\ 0 ! 'TP !_P @E
M , !@ !$8 /__ "D *0 #P, \% /*0 # 8 !& #__P " "0
M \K /- #T, P & $1@ __\ "0 / /3P #V ]A , !@
M$8 /_^ !$ 0 #V( ^+ /M # 8 !& #__P I "D _= 0
M!0 $ 8 P & (1@ __\ * !__\ 0 ' !D 4 9
M < @ " !0 1 4 (! $ P & !D "
M)@,! 3_____ " ) "P,! 7_____ " , +
M !P,! ;_____ " . 2 "@,! +_____ "
M0P < "@,! " A !D P$ 4 3 !$ "0 0 !0
M /\1 " % ( K_____ !P 3@ % ! O_____ !P
M ( 7 $ % ! S_____ !P <0 ( % ! W_____
M !P A@ , % ! [_____ !P FP 0 % ! __
M____ !P L 4 % ! !#_____ !P Q0 8 % !
M C_____ !P V@ < % ! !@ $@ 7 !0 /\1 -
M$@ & !/_____ !P [P $@ ! !3_____ !P _
M $ $@ ! !7_____ !P !# 4 $@ ! !;_____ !P ( !
M$P 0 $@ ! !?_____ !P !)@ ( $@ ! !'_____ !P
M !- , $@ ! "$ &0 @ !0 /\1 4 $P ( !K_____ !P
M !1@ $P ! !O_____ !P !40 $ $P ! !S_____
M !P !7P , $P ! !W_____ !P ( !<0 ( $P ! ![_
M____ !P !A0 0 $P ! !______ !P !F0 8 $P !
M "#_____ !P !IP < $P ! !C_____ !P ( !MP 4
M$P ! < (@ M !0 /\1 > &@ , "/_____ !P !RP
M &@ ! "3_____ !P !WP 8 &@ ! "7_____ !P ( !
M]@ @ &@ ! ";_____ !P "$0 < &@ ! "?_____ !P
M ")@ H &@ ! "C_____ !P ( ".@ 4 &@ ! "G_____ !P
M "50 $ &@ ! "K_____ !P ";@ , &@ ! "O_____
M !P "> ( &@ ! "S_____ !P "A D &@ ! "W_
M____ !P "F@ L &@ ! "'_____ !P ( "K0 0 &@ !
M__\ 0 ! !0 0 (1 &%@8! #_____ !P ( "OP$! P
M%0 !__\ 0 ! !0 0 (1 & D! #_____ !P ( "U0 !
M! %@ !__\ 0 ! !0 0 (1 '#P<! #_____ !P ( "
M[ ! P #@ !__\ 0 < !0 0 (1 +@ 1 +_____ !8 @
M 4U@ ' $ 'P ! /_____ !8 4\@ 8 , !P ! 3_____ !8
M 5#@ ? , "0 ! < !0 & !8 5*@ & 0 (@ ! ;_____
M !X " 51@ 7 @ ! 3_____ !X " 58@ @ @ ! H
M" ) !8 5?@ & 4 (@ ! G_____ !X " 5F@ 7 @ !
M ?_____ !X " 5M@ @ @ ! P "P + !8 5T@ & 8
M(@ ! K_____ !X " 5[@ @ @ ! \ #0 . !8 6"@ &
M < (@ ! [_____ !X " 6)@ 7 @ ! S_____ !X " 6
M0@ @ @ ! !$ $ 0 !8 67@ & @ (@ ! ______ !X "
M 6>@ 7 @ ! !, $@ 2 !8 6E@ & D (@ ! !'_____ !X
M" 6L@ 7 @ ! !8 % 5 !8 6S@ & H (@ ! !7_____
M !X " 6Z@ 7 @ ! !/_____ !X " 7!@ @ @ ! !@
M%P 7 !8 7(@ & L (@ ! !;_____ !X " 7/@ @ @ !
M !L &0 : !8 76@ & P (@ ! !K_____ !X " 7=@ 8
M 0 ! !C_____ !X " 7D@ A 0 ! !S_____ !H !P $4 &
M X " ! #_____ !H )0 $4P @ X " !__\ 0 D !0 0 (1
M )@ 2 +_____ !8 @ @ 7K@ ' $ %P ! /_____ !8 @ @
M 7R@ ' $ %P ! 8 ! % !0 /\1 # , ( ! 7_____ !T
M" 7Y@ + %0 ! /_____ !4 8 @ !@ ! D !P (
M !0 /\1 # 0 ( ! C_____ !T " 8'@ + %0 ! ;_
M____ !4 8.@ "0 ! P "@ + !0 /\1 # 8 ( !
M O_____ !T " 85@ 9 !P ! G_____ !4 8<@
M$P ! \ #0 . !0 /\1 # H ( ! [_____ !T " 8C@ ;
M !0 ! S_____ !4 8J@ "P ! !( $ 1 !0 /\1
M # L ( ! !'_____ !T " 8Q@ ; !0 ! ______ !4
M 8X@ $P ! !4 $P 4 !0 /\1 # P ( ! !3_____ !T
M" 8_@ ; !0 ! !+_____ !4 9&@ %0 ! !@ %@ 7
M !0 /\1 # @ ( ! !?_____ !T " 9-@ 9 !P ! !7_
M____ !4 94@ $P ! !L &0 : !0 /\1 # T ( !
M !K_____ !T " 9;@ > @ ! !C_____ !4 9B@
M% ! !S_____ !H 0 %]P : \ "0 ! !\ '0 > !0 /\1 #
M < ( ! ![_____ !T " 9I@ 9 !P ! !S_____ !4 9
MP@ $P ! "#_____ !8 @ @ 9W@ ' $ %P ! "'_____ !8 @ @
M 9^@ ' $ %P ! "+_____ !H 0 &4 / \ "0 ! "/_____ !H
M!P ( &60 # \ "0 ! "3_____ !8 @ @ :%@ ' $ %P ! #_____
M !8 H @ :,@ ' $ %P !__\ 0 - !0 0 (1 $(0L. +_
M____ !T " :3@ * , "P ! /_____ !H !P &@00,"PP " !
M 3_____ !4 ::@ @ (0 ! 7_____ !4 :A@ <
M(0 ! < !@ & !0 0 ,1\0 ' $ $P " 7_____ !4 :H@ #
M" #0 ! C_____ !T :O@( !@0$( (! G_____ !T :
MV@, "04#( (! K_____ !D 0 (1 0$# ,!& 8% O_____ !4
M :]@$$"@D&& 8 S_____ !4 ;$@$$! H&&P8 W_____ !4
M ;+@$$#0H$' 8 #_____ !4 ( ;2@$$!@L$&08 __\ 0 %
M !0 0 (1 ,@ * +_____ !4 ;9@ % $ )P ! /_
M____ !4 ;@@ * ( '@ ! 3_____ !T " ;G@ * , "P !
M 7_____ !X " ;N@ % 4 * ! #_____ !H )P (3@ 4 @
M" !__\ 0 ! !0 0 (1 & <! #_____ !P ( (404
M! %%@\ __\ 0 K !0 (1 3@ 5 +_____ !P (
M: # ! /_____ !P (=0 $ # ! 3_____ !P
M (@@ ( * ! 7_____ !P (JP 0 &P ! ;_____ !P
M (QP , '@ ! ?_____ !P (Y@ 8 * ! C_____
M !P )#P 4 $P ! G_____ !P )(P < (0 ! K_
M____ !P )10 @ $ ! O_____ !P )5@ L * !
M S_____ !P )?P P ' ! W_____ !P )G T
M%P ! [_____ !P )M X &0 ! ______ !P )S@
M \ )@ ! !#_____ !P )]0 ! $0 ! !'_____ !P *
M!P !$ (0 ! !+_____ !P **0 !( ) ! !/_____ !P
M *3@ !, (@ ! !3_____ !P *<0 !0 * ! !7_____ !P
M *F@ D (0 ! !;_____ !P *O H $ ! !?_____
M !P *S0 I 0 '0 ! !C_____ !P *ZP I , %P ! !G_
M____ !P + P I ( &P ! !K_____ !P +'P E * !
M !O_____ !P +2 E $ )P ! !S_____ !P +< I 4
M'@ ! !W_____ !P +CP I 8 %P ! ![_____ !P +IP I
M < (P ! !______ !P +RP I L ' ! "#_____ !P +
MZ I H (0 ! "'_____ !P ,"@ I P '@ ! "+_____ !P
M ,*0 C @ * ! "/_____ !P ,4@ I D %@ ! "3_____ !P
M ,:0 C T ( ! "7_____ !P ,B@ I X &P ! ";_____
M !P ,I@ I \ ) ! "?_____ !P ,RP I ! (0 ! "C_
M____ !P ,[0 C !$ * ! "G_____ !P -%@ E !( )@ !
M "K_____ !P -/0 I !0 &0 ! "O_____ !P -5P F !,
M'@ ! + Q !0 @ /\1 3@ 5 "W_____ !P -=@
M 4 !@ ! "[_____ !P -?0 $ )@ ! "______ !P -
MI ( &P ! ##_____ !P -P )@ ! #'_____ !P
M -YP , (P ! "O_____ !P ( ."P 0 * !__\ 0 ! !0
M 0 (1 &$P<! #_____ !P ( .- $! @ $@ !__\ 0 !
M !0 0 (1 &&0<! #_____ !P ( .1P ! P & !__\
M 0 ! !0 0 (1 &"P<! #_____ !P ( .8 (! P "@ !
M__\ 0 ! !0 0 (1 !#P8! #_____ !P ( .:P8 @
M#0 !__\ 0 ! !0 0 (1 %'@8! #_____ !P ( .>0(!
M P '0 !__\ 0 ! !0 0 (1 $(08! #_____ !P ( .
MEP8 P ( !__\ 0 ! !0 0 (1 &(@<! #_____ !P (
M .N < P (0 !__\ 0 ! !0 0 (1 '*08! #_____ !P
M( .V@ ! @ * !__\ 0 # !0 0 (1 *@ ) +_____
M !T " ;U@ $ $ (P ! /_____ !T ;\@ . , #@ ! #_
M____ !H )P /3 1 8 " !__\ 0 % !0 0 (1 ,0 ,
M +_____ !8 @ <#@ 0 $ $ ! /_____ !T " <*@ $ 8
M* ! 3_____ !4 <1@ $ 0 )P ! 7_____ !H !P 0!P '
M D " ! #_____ !H )0 0"@ A D " ! <8@ (+( "#B A
M$@ (4( "/Z G<@ *,( "E2 I@@ +C( "YB ND@ +L( "[R
4 O(@ +U( "^" OL@ ,!)2
end
SHAR_EOF
fi
exit 0
# End of shell archive
Technical Details
Message-ID:
<600015@coma.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxt!houxm!whuxl!whuxlm!akgua!gatech!seismo!mcvax!unido!coma!axelShow Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxt!houxm!whuxl!whuxlm!akgua!gatech!seismo!mcvax!unido!coma!axel From: axel@coma.UUCP Newsgroups: net.micro.atari16 Subject: GEM-Kermit (Part 6 of 6) Message-ID: <600015@coma.UUCP> Date: Thu, 19-Jun-86 23:07:00 EDT Article-I.D.: coma.600015 Posted: Thu Jun 19 23:07:00 1986 Date-Received: Sat, 28-Jun-86 04:03:12 EDT Sender: notes@unido.UUCP Lines: 1581 Nf-ID: #N:coma:600015:000:59999 Nf-From: coma!axel Jun 20 04:07:00 1986