home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
BEEHIVE
/
COMMS
/
YAM.ARC
/
YAM1.C
< prev
next >
Wrap
Text File
|
1990-09-20
|
13KB
|
643 lines
/*
>>:yam1.c
* Mainline for yam 18-Nov-82 (diff 10-25-81)
* 'go', 'exit' and 'off' modifications by Bill Bolton, March 15, 1982
* 'loop' and 'test' added for loopback testing of line, John Woolner,
* August 28, 1982
*/
#include "yam.h"
#define MAXARGS 20
main(argc, argv)
char **argv;
{
int c;
char *args[MAXARGS], **argp, **argq, *nextcmd, *p;
init1_extra(); /* special initialisation in YAM11.C */
nextcmd=NULL;
printf("Yet Another Modem by Chuck Forsberg\n");
printf("%s %s\n", FLAVOR, VERSION);
init();
if(argc>MAXARGS)
goto usage;
/* copy given arguments to our own array */
for(argp=argv,argq=args,c=argc; --c>=0;)
*argq++ = *argp++;
#ifdef TERMRESET
lprintf(TERMRESET);
#endif /* TERMRESRET */
for(;;) {
if(argc < 2) {
if(nextcmd)
cp=nextcmd;
else {
#ifdef XMODEM
printf("xYAM(%c%d)", defdisk+'A', user);
#else
printf(">>>%c%d:", defdisk+'a', user);
#endif /* XMODEM*/
gets(cmdbuf);
#ifdef TERMRESET
lprintf(TERMRESET);
#endif /* TERMRESET */
init2_extra(); /* in YAM11 */
cp=cmdbuf;
/*
* Check for *text... which sends the rest of the line to
* the modem
*/
if((*cp)=='*') {
abptr= ++cp;
abend= cp + strlen(cp);
/* Add proper end of line stuff according to Txeoln */
switch(Txeoln) {
case EOL_CR:
case EOL_CRWAIT:
case EOL_CRPROMPT:
*abend++ = '\r';
break;
case EOL_NOTHING:
case TX_BINARY:
*abend++ = '\r';
case EOL_NL:
*abend++ = '\n';
break;
}
Exoneof=TRUE;
term();
continue;
}
}
if(nextcmd=index(';', cp))
*nextcmd++ =0; /* ; separates commands */
else if(nextcmd=index('\\', cp))
*nextcmd++ =0; /* \ separates commands */
argp= &args[1]; argc=1;
for(;;) {
if(isgraphic(*cp)) {
*argp++ = cp;
argc++;
while(isgraphic(*cp))
cp++;
}
while(*cp==' ' || *cp=='\t')
*cp++ =0;
if(*cp > ' ')
continue;
*cp=0;
break;
}
}
for(argp= &args[1]; --argc>0; ) {
uncaps(*argp);
cp= *argp++;
Gototerm=Batch=Crcflg=Creamfile=Echo=Ctlview=
Chat=View=Type=Quiet=FALSE;
#ifdef CPM
if(index(':', cp)) {
chdir(cp);
continue;
}
#endif /* CPM */
switch(*cp++) {
case 'b':
if(cmdeq(cp, "ye")) {
#ifdef BYEPROG
cp=4; *cp=0; /* reset user/driv */
exec(BYEPROG);
#else
bye();
continue;
#endif /* BYEPROG */
}
else if(setbaud(atoi(cp)))
goto usage;
continue;
case 'c':
#ifndef RESTRICTED
if(cmdeq(cp, "all") && --argc ==1) {
uncaps(*argp); /* make name lcase */
if(getphone(*argp++,Phone)==ERROR)
goto usage;
else if(dial(Phone)==ERROR)
goto usage;
continue;
}
#endif /* RESTRICTED */
if(cmdeq(cp, "hat")) {
chat();
continue;
}
if(cmdeq(cp, "lose")) {
dumprxbuff();
closerx(TRUE); closetx(TRUE);
continue;
}
if(cmdeq(cp, "rck")) {
docrck( --argc, argp);
argc=0; continue;
}
goto usage;
case 'd':
if(cmdeq(cp, "ir")) {
#ifndef CDOS
if(cp[2])
docomp(--argc, argp);
else
#endif /* CDOS */
dodir(--argc, argp);
argc=0;
}
else if(setval(0)==ERROR)
goto usage;
continue;
case 'e':
#ifndef RESTRICTED
if(cmdeq(cp, "ra")) {
doerase( --argc, argp); argc=0;
continue;
}
#endif /* RESTRICTED */
if(cmdeq(cp, "xit")) {
dumprxbuff();
closerx(TRUE); closetx(TRUE);
printf("Exiting to DOS, files closed");
#ifndef XMODEM
onhook();
printf(", modem disconnected.");
#endif /* XMODEM */
printf("\n");
exit(0);
}
if(setval(~0)==ERROR)
goto usage;
continue;
case 'f':
closetx(TRUE);
if(setval(~0)==ERROR)
goto usage;
if(--argc<=0 || opentx(*argp++)==ERROR)
goto usage;
if(Squelch) {
/* frame file with ^R T if Squelch */
sendline(022);
}
term(0);
if(Squelch) {
sendline(024);
}
continue;
case 'g':
if(cmdeq(cp, "o"))
exit();
else
goto usage;
case 'i':
if(cmdeq(cp, "nit")) {
init(); argc=nextcmd=0; continue;
}
else
goto usage;
case '?':
case 'h':
#ifdef XMODEM
Type++; /* send to remote user */
#endif /* XMODEM */
listfile(HELPFILE);
continue;
case 'k':
if(cmdeq(cp, "ill")) {
clearbuf();
continue;
}
else
goto usage;
case 'l':
if(cmdeq(cp, "ist")) {
View++;
listit:
dolist( --argc, argp);
argc=0;
continue;
}
#ifndef RESTRICTED
if (cmdeq(cp,"oop")) {
loop(atoi(cp += 3));
continue;
}
#endif /* RESTRICTED */
else
goto usage;
#ifndef RESTRICTED
case 'm':
Sport=(Dport=atoi(cp))+(SPORT-DPORT);
readbaud(); continue;
#endif /* RESTRICTED */
case 'o':
if(cmdeq(cp, "ff")) {
#ifdef TERMRESET
lprintf(TERMRESET);
#endif /*TERMRESET */
#ifdef BYEPROG
cp=4; *cp=0; /* reset user/driv */
exec(BYEPROG);
#else
onhook();
#endif /* BYEPROG */
printf("Off Line\n"); Continue;
}
if(cmdeq(cp, "n")) {
online();
printf("On line\n");
continue;
}
else
goto usage;
case 'p':
if(setparm(cp)==ERROR)
goto usage;
continue;
case 'q':
if(cmdeq(cp, "uit")) {
printf("Quitting YAM\n");
exit();
}
goto usage;
case 'r':
if(cmdeq(cp, "eset")) {
#ifdef TERMINIT
lprintf(TERMINIT);
#endif /* TERMINIT */
closetx(TRUE);
dumprxbuff();
closerx(TRUE);
#ifdef CPM
bdos(13,0);
bdos(14,defdisk);
#endif /* CPM */
/* change buffer size for debugging */
if(--argc>0) {
bufend= bufst + atoi(*argp++);
clearbuf();
dostat();
}
continue;
}
if(cmdeq(cp, "ep")) {
replot(argc>1 ? (--argc,atoi(*argp++)) : 0);
continue;
}
if(cmdeq(cp, "ew")) {
rewindcb(); continue;
}
if(chkbvq()==ERROR)
goto usage;
if(argc<2)
Batch=TRUE;
psxfer(wcreceive(--argc, argp));
if(Gototerm)
term();
argc=0; continue;
case 's':
if(*cp == 0 && argc==1) {
dostat();
continue;
}
if(argc<2 || chkbvq()==ERROR)
goto usage;
if( argc > 2
|| index('?',*argp) || index('*',*argp))
Batch=TRUE;
#ifdef XMODEM
/* tell 'em how long it will take! */
if(Batch)
docomp(argc-1, argp);
#endif /* XMODEM */
psxfer(wcsend(--argc, argp));
if(Gototerm)
term();
argc=0;
continue;
#ifndef XMODEM
case 'u':
if(argc>1)
goto usage; /* trap "user 0" */
abptr=Wrapped?bufcq+1:bufst;
abend=bufcq;
/* fall through to T */
#endif /* XMODEM */
case 't':
if(cmdeq(cp, "ype")){
#ifdef XMODEM
Type++; /* send to remote user */
#endif /* XMODEM */
goto listit;
}
#ifndef RESTRICTED
if (cmdeq(cp,"est")) {
linetest(atoi(cp += 3));
continue;
}
#endif /* RESTRICTED */
#ifndef XMODEM
if(--argc > 0) {
dumprxbuff(); closerx(TRUE);
if(opencapt(*argp++)==ERROR)
goto usage;
}
switch(setval(~0)) {
case ERROR:
goto usage;
case OK:
term();
case TRUE:
/* remain in command mode if t..c */
break;
}
continue;
/* note: case u precedes T */
case 'w':
dumprxbuff(); continue;
#endif /* XMODEM */
case 'x':
continue; /* in case you said "XMODEM" */
case 0:
default:
goto usage;
}
continue;
}
continue;
usage:
printf("Type HELP for instructions\n");
nextcmd=argc=0; continue;
}
}
chkbvq()
{
while(*cp)
switch(*cp++) {
case 'b':
Batch=TRUE; break;
case 'c':
Crcflg=TRUE; break;
case 'q':
Quiet=TRUE; break;
#ifndef RESTRICTED
case 't':
Gototerm=TRUE; break;
case 'v':
View=TRUE; break;
case 'y':
Creamfile=TRUE; break;
#endif /* RESTRICTED */
default:
return ERROR;
}
return FALSE;
}
setval(value)
unsigned value;
{
FLAG dumped;
dumped=FALSE;
while(*cp)
switch(*cp++) {
case 'a':
Chat = value;
break;
case 'b':
Txeoln= value&TX_BINARY;
Txmoname="BINARY";
break;
case 'c':
dumprxbuff();
closerx(dumped=TRUE);
break;
case 'd':
Dumping = !Squelch || value;
break;
case 'e':
Echo=value;
break;
case 'f':
Hdx= !value;
break;
case 'g':
Txgo= value;
break;
case 'h':
Hdx=value;
break;
case 'i':
Image=value;
break;
case 'l':
Pflag=value;
break;
case 'n':
Txeoln =value&EOL_NL;
Txmoname="NL ONLY";
break;
case 'o':
Pflag= !value;
break;
case 'p':
Txeoln =value&EOL_CRPROMPT;
Txmoname="WAIT FOR PROMPT";
break;
case 'r':
Txeoln =value&EOL_CR;
Txmoname="CR ONLY";
break;
case 's':
Squelch=value;
break;
case 't':
Waitbunch=value;
break;
case 'v':
Ctlview++;
break;
case 'w':
Txeoln= value&EOL_CRWAIT;
Txmoname="CR WAIT FOR NL";
break;
case 'x':
Exoneof=value;
break;
case 'z':
Zeof=value;
break;
default:
return ERROR;
}
return dumped;
}
init()
{
#ifdef BDSC
char *endext(), *topofmem(), *codend(), *externs();
if(codend() > externs()) { /* check for bad -e value! */
printf("urk"); exit();
}
#endif /* BDSC */
#ifdef USERINIT
userinit(); /* allows extra user externs' to be initialized */
#endif /* USERINIT */
initdd(); /* fetch default disk and user number */
bufst=endext();
bufend=topofmem()-1024; /* fudge so we don't crash ... */
Dport=DPORT; Sport=SPORT;
#ifndef DEFBAUD
readbaud();
#else
Baudrate=DEFBAUD;
#endif /* DEFBAUD */
#ifdef INITBAUD
setbaud(Baudrate);
#endif /* INITBAUD */
Mstatus=0;
Rfile=Tfile=Pflag=FALSE;
Image=Waitbunch=Exoneof=Hdx=Zeof=Squelch=FALSE;
Txgo=TRUE;
Parity= NORMAL;
Originate= TRUE;
Txeoln= EOL_NOTHING;
Low= 400;
Tpause=1500*CLKMHZ;
Throttle=80*CLKMHZ;
T1pause=311*CLKMHZ;
Waitnum=1;
GOchar= '\n';
clearbuf();
}
clearbuf()
{
abptr=NULL;
Xoffflg=Wrapped= FALSE;
buffcdq=bufcq=bufcdq=bufpcdq=bufmark= bufst;
Bufsize=Free= bufend-bufst-1;
}
cmdeq(s,p)
char *s, *p;
{
while(*p)
if(*s++ != *p++)
return 0;
return 1;
}
dostat()
{
printf("Capture %s Receiving %s ",
Dumping?"ON":"SQUELCHED", Rfile?Rname:"<nil>");
if(Image)
printf("Transparency mode ");
if(Squelch)
printf("^R ^T Squelch ");
if(Zeof)
printf("EOF on ^Z");
printf("\n");
if(Txeoln==EOL_NOTHING)
Txmoname="IMAGE";
printf("%sSending %s in %s mode\n",
Txgo? "" : "Pausing in ", Tfile?Tname:"<nil>", Txmoname);
printf("%sWaiting %d loops every %u chars Pause=%u GOchar=0%o\n",
Waitbunch?"":"NOT ",Throttle, Waitnum, Tpause, GOchar);
printf("Printer %s ", Pflag?"ON":"OFF");
if(Hdx)
printf("Half Duplex ");
printf("At %u baud data port %u\n", Baudrate, Dport);
printf("%u of %u chars used %u free%s\n",
Bufsize-Free, Bufsize, Free, Wrapped?" POINTERS WRAPPED":"");
printf("bufst=%x bufcq=%x bufcdq=%x\nbuffcdq=%x bufpcdq=%x bufend=%x\n",
bufst, bufcq, bufcdq, buffcdq, bufpcdq, bufend);
#ifndef CDOS
printdfr();
#endif /* CDOS */
}
isgraphic(c)
{
if(c>' ' && c<0177)
return TRUE;
else
return FALSE;
}
/*
* index returns a pointer to the first occurrence of c in s,
* NULL otherwise.
*/
char *index(c, s)
char c,*s;
{
for(; *s; s++)
if(c== *s)
return s;
return NULL;
}
psxfer(status)
{
lpstat("\007File transfer(s) %s\007",
status==ERROR?"ABORTED BY ERROR" : "successful");
#ifndef CDOS
printdfr();
#endif /* CDOS */
}
setparm(p)
char *p;
{
if(*p)
switch(*p++) {
case 'g':
if((GOchar= *p) == '^')
GOchar= (*++p & 037);
break;
case 'l':
Low=atoi(p);
break;
case 'p':
Tpause=atoi(p);
break;
case 't':
Throttle=atoi(p);
break;
case 'w':
Waitnum=atoi(p);
break;
default:
return ERROR;
}
return 0;
}
/* make strings lower case */
uncaps(s)
char *s;
{
while(*s)
*s = tolower(*s++);
}
/* end of YAM1.C */