/* >>:yam1.c 9-17-83 (file revision date excluding VERSION) * Mainline for yam */ #define VERSION "4.28 Rev 11-4-83" #include "yam.h" #define MAXARGS 20 main(argc, argv) char **argv; { int c, srstatus; char *args[MAXARGS], **argp, **argq, *nextcmd; nextcmd=NULL; printf("Yet Another Modem by Chuck Forsberg\n"); printf("%s %s\n", FLAVOR, Version=VERSION); onceonly(); init(); if(argc>MAXARGS) goto usage; /* copy given arguments to our own array */ for(argp=argv,argq=args,c=argc; --c>=0;) *argq++ = *argp++; termreset(); for(;;) { if(argc < 2) { if(nextcmd) cp=nextcmd; else { if(Onetrip) { #ifdef USEREXIT userexit(); #endif exit(0); } #ifdef XMODEM printf("\nxYAM(%c%d)", defdisk+'A', user); #else printf("\n>>>%c%d:", defdisk+'a', user); #endif gets(cmdbuf); termreset(); cp=cmdbuf; #ifdef SYSFUNC if(*cp=='!') { system(++cp); continue; } #endif /* * 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=UsePutchar=View=Quiet=FALSE; blklen=SECSIZ; Wcsmask = 0377; #ifdef DEFBYTL Bytesleft=DEFBYTL; #endif #ifdef CPM if(index(':', cp)) { chdir(cp); continue; } #endif switch(*cp++) { case 'b': #ifdef BBSPROG if(cmdeq(cp, "bs")) { cp=4; *cp=0; /* reset user/driv */ exec(BBSPROG); } #endif if(cmdeq(cp, "ye")) { #ifdef BYEPROG cp=4; *cp=0; /* reset user/driv */ exec(BYEPROG); #else bye(); continue; #endif } else if(*cp == 'r') { sendbrk(); continue; } else if(setbaud(atoi(cp))) goto usage; continue; case 'c': #ifndef RESTRICTED if(cmdeq(cp, "all") && --argc >=1) { Jovemode=Exitchar=Pflag=FALSE; Cis02=Twxmode=Image=Waitbunch =Exoneof=Hdx=Zeof=Squelch=FALSE; Txgo=TRUE; Txeoln=EOL_NOTHING; uncaps(*argp); /* make name lcase */ if(getphone(*argp++,Phone)==ERROR) goto usage; else if(dial(Phone)==ERROR) goto usage; continue; } #endif if(cmdeq(cp, "hat")) { dochat(); continue; } #ifdef BIGYAM if(cmdeq(cp, "hek")) { docrc( --argc, argp); argc=0; continue; } if(cmdeq(cp, "rck")) { docrck( --argc, argp); argc=0; continue; } #endif if(cmdeq(cp, "lose")) { dumprxbuff(); closerx(TRUE); closetx(TRUE); continue; } goto usage; case 'd': if(cmdeq(cp, "ir")) { #ifndef CDOS if(cp[2]) docomp(--argc, argp); else #endif dodir(--argc, argp); argc=0; continue; } #ifdef BIGYAM else if (cmdeq(cp, "ump")) { dodumph( --argc, argp); argc=0; continue; } #endif else if(setval(0)==ERROR) goto usage; continue; case '-': case 'e': if(cmdeq(cp, "ra")) { #ifdef RESTRICTED goto nono; #else doerase( --argc, argp); argc=0; continue; #endif } if(setval(~0)==ERROR) goto usage; continue; case 'f': #ifdef FLIP if(cmdeq(cp, "lip")) { if(flip( --argc, argp)==ERROR) goto usage; continue; } #endif closetx(TRUE); if(setval(~0)==ERROR) goto usage; if(--argc<=0 || opentx(*argp++)==ERROR) goto usage; #ifndef XMODEM if(Echo) psxfer(sendecho()); else #endif if (Twxmode) Txgo = FALSE; else { /* frame file with ^R T if Squelch */ if(Squelch) sendline(022); term(); if(Squelch) sendline(024); } continue; case 'i': if(cmdeq(cp, "nit")) { init(); argc=0; nextcmd=0; continue; } else goto usage; case '?': case 'h': listfile(HELPFILE); continue; case 'k': if(cmdeq(cp, "ill")) { clearbuff(); continue; } else goto usage; case 'l': if(cmdeq(cp, "ist")) { ++UsePutchar; listit: dolist( --argc, argp); termreset(); argc=0; continue; } #ifdef LINKPORT if(cmdeq(cp, "ink")) { dolink(); continue; } #endif else goto usage; #ifndef RESTRICTED case 'm': #ifdef BBSPROG if(cmdeq(cp, "inirbbs")) { cp=4; *cp=0; /* reset user/driv */ exec(BBSPROG); } #endif closetx(TRUE); if (chngport(atoi(cp))==ERROR) goto usage; continue; #endif case 'o': termreset(); #ifdef BYEPROG cp=4; *cp=0; /* reset user/driv */ #endif onhook(); if(cmdeq(cp, "ff")) { dumprxbuff(); closerx(TRUE); closetx(TRUE); #ifdef USEREXIT /* we do not wany any interrupts */ purgeline(); userexit(); #endif exit(0); } printf("On Hook"); continue; case 'p': if(setparm(cp)==ERROR) goto usage; continue; case 'r': #ifdef BBSPROG if(cmdeq(cp, "bbs")) { cp=4; *cp=0; /* reset user/driv */ exec(BBSPROG); } #endif if(cmdeq(cp, "eset")) { terminit(); closetx(TRUE); dumprxbuff(); closerx(TRUE); #ifdef CPM bdos(13,0);bdos(14,defdisk); printdfr(); #endif /* change buffer size for debugging */ if(--argc>0) { bufend= bufst + atoi(*argp++); clearbuff(); 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(srstatus=(wcreceive(--argc, argp))); if(Gototerm) term(); argc=0; continue; case 's': #ifdef BIGYAM if (cmdeq(cp, "um")) { dosum( --argc, argp); argc=0; continue; } #endif 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 psxfer(wcsend(--argc, argp)); if(Gototerm) term(); argc=0; continue; #ifndef XMODEM case 'u': if(cmdeq(cp, "nix")) { term(); continue; } goto usage; /* trap "user 0" */ #endif case 't': if(cmdeq(cp, "ype")) goto listit; if(--argc > 0) { if(opencapt(*argp++)==ERROR) goto usage; } switch(setval(~0)) { case ERROR: goto usage; case OK: term(); case TRUE: break; /* remain in command mode if t..c */ } continue; /* note: case u precedes T */ case 'w': #ifdef BIGYAM if (cmdeq(cp, "c")) { dowc( --argc, argp); argc=0; continue; } #endif dumprxbuff(); continue; case 'x': /* in case user typed "XMODEM ..." */ if(*cp) continue; dumprxbuff(); closerx(TRUE); closetx(TRUE); #ifdef USEREXIT userexit(); #endif exit(0); case 0: default: goto usage; } } continue; #ifdef RESTRICTED nono: printf("Command not allowed\n"); #endif usage: printf("Type HELP"); nextcmd=0; argc=0; continue; } } chkbvq() { while(*cp) switch(*cp++) { case '7': Wcsmask = 0177; break; case 'b': Batch=TRUE; break; case 'c': Crcflg=TRUE; break; case 'k': blklen=KSIZE; break; case 'q': Quiet=TRUE; break; #ifndef RESTRICTED case 't': Gototerm=TRUE; break; case 'v': View=TRUE; break; case 'y': Creamfile=TRUE; break; #endif default: return ERROR; } return FALSE; } setval(value) unsigned value; { FLAG dumped; dumped=FALSE; while(*cp) switch(*cp++) { case '!': value = 0; break; case '2': Cis02=value; break; 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 'j': if (value && Exitchar==0) Exitchar = 037; if (!value) Exitchar = 0; Jovemode=value; break; case 'k': blklen=KSIZE; break; case 'l': Pflag=value; break; case 'n': Txeoln =value&EOL_NL; Txmoname="NL ONLY"; break; case 'o': Onetrip=value; break; case 'p': Txeoln =value&EOL_CRPROMPT; Txmoname="WAIT FOR PROMPT"; break; case 'q': Twxmode = value; break; case 'r': Txeoln =value&EOL_CR; Txmoname="CR ONLY"; break; case 's': Dumping = !(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; } clearbuff() { lkbufcq=abptr=NULL; Xoffflg=Wrapped= FALSE; buffcdq=bufcq=bufcdq=bufpcdq=bufmark= bufst; Bufsize=Nfree= bufend-bufst-1; } dostat() { printf("Yam %s Capture %s Receiving %s ", Version, Dumping?"ON":"SQUELCHED", Rfile?Rname:""); if(Image) printf("Transparency mode "); if(Squelch) printf("^R ^T Squelch "); if(Zeof) printf("EOF on ^Z"); printf("\n"); if(Txeoln==EOL_NOTHING) Txmoname="normal"; printf("%sSending %s in %s mode\n", Txgo? "" : "Pausing in ", Tfile?Tname:"", 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-Nfree, Bufsize, Nfree, Wrapped?" POINTERS WRAPPED":""); /* printf("bufst=%x bufcq=%x bufcdq=%x buffcdq=%x bufpcdq=%x bufend=%x\n", bufst, bufcq, bufcdq, buffcdq, bufpcdq, bufend); */ if (toterrs) { printf("%u Total errors detected\n", toterrs); toterrs = 0; } #ifndef CDOS printdfr(); #endif } 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) { #ifdef XREM printf("File transfer(s) "); #else printf("\007File transfer(s) "); #endif if (status==ERROR) printf("ABORTED BY ERROR\n\007"); else { printf("successful\n"); termreset(); } #ifndef CDOS printdfr(); #endif } setparm(p) char *p; { if ( !isdigit(p[1])) return ERROR; firstch = atoi(p + 1); switch(*p) { case 'e': Exitchar= firstch; break; case 'g': GOchar= firstch; break; case 'p': Tpause=firstch; break; case 't': Throttle=firstch; break; case 'w': Waitnum=firstch; break; default: return ERROR; } return 0; } /* make string s lower case */ uncaps(s) char *s; { for( ; *s; ++s) *s = tolower(*s); }