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 >
Text File  |  1990-09-20  |  13KB  |  643 lines

  1. /*
  2. >>:yam1.c
  3.  * Mainline for yam 18-Nov-82 (diff 10-25-81)
  4.  * 'go', 'exit' and 'off' modifications by Bill Bolton, March 15, 1982
  5.  * 'loop' and 'test' added for loopback testing of line, John Woolner,
  6.  * August 28, 1982
  7.  */
  8. #include "yam.h"
  9. #define MAXARGS 20
  10.  
  11. main(argc, argv)
  12. char **argv;
  13.  
  14. {
  15.     int c;
  16.     char *args[MAXARGS], **argp, **argq, *nextcmd, *p;
  17.  
  18.     init1_extra();    /* special initialisation in YAM11.C */
  19.  
  20.     nextcmd=NULL;
  21.     printf("Yet Another Modem by Chuck Forsberg\n");
  22.     printf("%s %s\n", FLAVOR, VERSION);
  23.     init();
  24.     if(argc>MAXARGS)
  25.         goto usage;
  26.     /* copy given arguments to our own array */
  27.     for(argp=argv,argq=args,c=argc; --c>=0;)
  28.         *argq++ = *argp++;
  29.  
  30. #ifdef TERMRESET
  31.     lprintf(TERMRESET);
  32. #endif /* TERMRESRET */
  33.  
  34.     for(;;) {
  35.         if(argc < 2) {
  36.             if(nextcmd)
  37.                 cp=nextcmd;
  38.             else {
  39. #ifdef XMODEM
  40.                 printf("xYAM(%c%d)", defdisk+'A', user);
  41. #else
  42.                 printf(">>>%c%d:", defdisk+'a', user);
  43. #endif /* XMODEM*/
  44.                 gets(cmdbuf);
  45. #ifdef TERMRESET
  46.                 lprintf(TERMRESET);
  47. #endif /* TERMRESET */
  48.                 init2_extra();    /* in YAM11 */
  49.                 cp=cmdbuf;
  50. /*
  51.  * Check for *text... which sends the rest of the line to
  52.  * the modem
  53.  */
  54.                 if((*cp)=='*') {
  55.                     abptr= ++cp;
  56.                     abend= cp + strlen(cp);
  57. /*  Add proper end of line stuff according to Txeoln */
  58.                     switch(Txeoln) {  
  59.                     case EOL_CR:
  60.                     case EOL_CRWAIT:
  61.                     case EOL_CRPROMPT:
  62.                         *abend++ = '\r';
  63.                         break;
  64.                     case EOL_NOTHING:
  65.                     case TX_BINARY:
  66.                         *abend++ = '\r';
  67.                     case EOL_NL:
  68.                         *abend++ = '\n';
  69.                         break;
  70.                     }
  71.                     Exoneof=TRUE;
  72.                     term();
  73.                     continue;
  74.                 }
  75.             }
  76.             if(nextcmd=index(';', cp))
  77.                 *nextcmd++ =0;    /*  ; separates commands */
  78.             else if(nextcmd=index('\\', cp))
  79.                 *nextcmd++ =0;    /*  \ separates commands */
  80.  
  81.             argp= &args[1]; argc=1;
  82.             for(;;) {
  83.                 if(isgraphic(*cp)) {
  84.                     *argp++ = cp;
  85.                     argc++;
  86.                     while(isgraphic(*cp))
  87.                         cp++;
  88.                 }
  89.                 while(*cp==' ' || *cp=='\t')
  90.                     *cp++ =0;
  91.                 if(*cp > ' ')
  92.                     continue;
  93.                 *cp=0;
  94.                 break;
  95.             }
  96.         }
  97.         for(argp= &args[1]; --argc>0; ) {
  98.             uncaps(*argp);
  99.             cp= *argp++;
  100.  
  101.             Gototerm=Batch=Crcflg=Creamfile=Echo=Ctlview=
  102.               Chat=View=Type=Quiet=FALSE;
  103. #ifdef CPM
  104.             if(index(':', cp)) {
  105.                 chdir(cp);
  106.                 continue;
  107.             }
  108. #endif /* CPM */
  109.             switch(*cp++) {
  110.             case 'b':
  111.                 if(cmdeq(cp, "ye")) {
  112. #ifdef BYEPROG
  113.                     cp=4; *cp=0;    /* reset user/driv */
  114.                     exec(BYEPROG);
  115. #else
  116.                     bye();
  117.                     continue;
  118. #endif /* BYEPROG */
  119.                 }
  120.                 else if(setbaud(atoi(cp)))
  121.                     goto usage;
  122.                 continue;
  123.             case 'c':
  124. #ifndef RESTRICTED
  125.                 if(cmdeq(cp, "all") && --argc ==1) {
  126.                     uncaps(*argp);    /* make name lcase */
  127.                     if(getphone(*argp++,Phone)==ERROR)
  128.                         goto usage;
  129.                     else if(dial(Phone)==ERROR)
  130.                         goto usage;
  131.                     continue;
  132.                 }
  133. #endif /* RESTRICTED */
  134.                 if(cmdeq(cp, "hat")) {
  135.                     chat();
  136.                     continue;
  137.                 }
  138.                 if(cmdeq(cp, "lose")) {
  139.                     dumprxbuff();
  140.                     closerx(TRUE); closetx(TRUE);
  141.                     continue;
  142.                 }
  143.                 if(cmdeq(cp, "rck")) {
  144.                     docrck( --argc, argp);
  145.                     argc=0; continue;
  146.                 }
  147.                 goto usage;
  148.             case 'd':
  149.                 if(cmdeq(cp, "ir")) {
  150. #ifndef CDOS
  151.                     if(cp[2])
  152.                         docomp(--argc, argp);
  153.                     else
  154. #endif /* CDOS */
  155.                         dodir(--argc, argp);
  156.                     argc=0;
  157.                 }
  158.                 else if(setval(0)==ERROR)
  159.                     goto usage;
  160.                 continue;
  161.             case 'e':
  162. #ifndef RESTRICTED
  163.                 if(cmdeq(cp, "ra")) {
  164.                     doerase( --argc, argp); argc=0;
  165.                     continue;
  166.                 }
  167. #endif /* RESTRICTED */
  168.                 if(cmdeq(cp, "xit")) {
  169.                     dumprxbuff();
  170.                     closerx(TRUE); closetx(TRUE);
  171.                     printf("Exiting to DOS, files closed");
  172. #ifndef XMODEM
  173.                     onhook();
  174.                     printf(", modem disconnected.");
  175. #endif /* XMODEM */
  176.                     printf("\n");
  177.                     exit(0);
  178.                 }                    
  179.                 if(setval(~0)==ERROR)
  180.                     goto usage;
  181.                 continue;
  182.             case 'f':
  183.                 closetx(TRUE);
  184.                 if(setval(~0)==ERROR)
  185.                     goto usage;
  186.                 if(--argc<=0 || opentx(*argp++)==ERROR)
  187.                     goto usage;
  188.                 if(Squelch) {
  189.                     /* frame file with ^R T if Squelch */
  190.                     sendline(022);
  191.                 }
  192.                 term(0);
  193.                 if(Squelch) {
  194.                     sendline(024);
  195.                 }
  196.                 continue;
  197.             case 'g':
  198.                 if(cmdeq(cp, "o"))
  199.                     exit();
  200.                 else
  201.                     goto usage; 
  202.             case 'i':
  203.                 if(cmdeq(cp, "nit")) {
  204.                     init(); argc=nextcmd=0; continue;
  205.                 }
  206.                 else
  207.                     goto usage;
  208.             case '?':
  209.             case 'h':
  210. #ifdef XMODEM
  211.                 Type++; /* send to remote user */
  212. #endif /* XMODEM */
  213.                 listfile(HELPFILE);
  214.                 continue;
  215.             case 'k':
  216.                 if(cmdeq(cp, "ill")) {
  217.                     clearbuf();
  218.                     continue;
  219.                 }
  220.                 else
  221.                     goto usage;
  222.             case 'l':
  223.                 if(cmdeq(cp, "ist")) {
  224.                     View++;
  225. listit:
  226.                     dolist( --argc, argp);
  227.                     argc=0;
  228.                     continue;
  229.                 }
  230. #ifndef RESTRICTED
  231.                 if (cmdeq(cp,"oop")) {
  232.                     loop(atoi(cp += 3));
  233.                     continue;
  234.                 }
  235. #endif /* RESTRICTED */
  236.                 else
  237.                     goto usage;
  238. #ifndef RESTRICTED
  239.             case 'm':
  240.                 Sport=(Dport=atoi(cp))+(SPORT-DPORT);
  241.                 readbaud(); continue;
  242. #endif /* RESTRICTED */
  243.             case 'o':
  244.                 if(cmdeq(cp, "ff")) {
  245. #ifdef TERMRESET
  246.                     lprintf(TERMRESET);
  247. #endif /*TERMRESET */
  248. #ifdef BYEPROG
  249.                     cp=4; *cp=0;    /* reset user/driv */
  250.                     exec(BYEPROG);
  251. #else
  252.                     onhook();
  253. #endif /* BYEPROG */
  254.                     printf("Off Line\n"); Continue;
  255.                 }
  256.                 if(cmdeq(cp, "n")) {
  257.                     online();
  258.                     printf("On line\n");
  259.                     continue;
  260.                 }
  261.                 else
  262.                     goto usage;
  263.             case 'p':
  264.                 if(setparm(cp)==ERROR)
  265.                     goto usage;
  266.                 continue;
  267.             case 'q':
  268.                 if(cmdeq(cp, "uit")) {
  269.                     printf("Quitting YAM\n");
  270.                     exit();
  271.                 }
  272.                 goto usage;
  273.             case 'r':
  274.                 if(cmdeq(cp, "eset")) {
  275. #ifdef TERMINIT
  276.                     lprintf(TERMINIT);
  277. #endif /* TERMINIT */
  278.                     closetx(TRUE);
  279.                     dumprxbuff();
  280.                     closerx(TRUE);
  281. #ifdef CPM
  282.                     bdos(13,0);
  283.                     bdos(14,defdisk);
  284. #endif /* CPM */
  285.                     /* change buffer size for debugging */
  286.                     if(--argc>0) {
  287.                         bufend= bufst + atoi(*argp++);
  288.                         clearbuf();
  289.                         dostat();
  290.                     }
  291.                     continue;
  292.                 }
  293.                 if(cmdeq(cp, "ep")) {
  294.                     replot(argc>1 ? (--argc,atoi(*argp++)) : 0);
  295.                     continue;
  296.                 }
  297.                 if(cmdeq(cp, "ew")) {
  298.                     rewindcb(); continue;
  299.                 }
  300.                 if(chkbvq()==ERROR)
  301.                     goto usage;
  302.                 if(argc<2)
  303.                     Batch=TRUE;
  304.                 psxfer(wcreceive(--argc, argp));
  305.                 if(Gototerm)
  306.                     term();
  307.                 argc=0; continue;
  308.             case 's':
  309.                 if(*cp == 0 && argc==1) {
  310.                     dostat();
  311.                     continue;
  312.                 }
  313.                 if(argc<2 || chkbvq()==ERROR)
  314.                     goto usage;
  315.                 if( argc > 2
  316.                   || index('?',*argp) || index('*',*argp))
  317.                     Batch=TRUE;
  318. #ifdef XMODEM
  319.                 /* tell 'em how long it will take! */
  320.                 if(Batch)
  321.                     docomp(argc-1, argp);
  322. #endif /* XMODEM */
  323.                 psxfer(wcsend(--argc, argp));
  324.                 if(Gototerm)
  325.                     term();
  326.                 argc=0;
  327.                 continue;
  328. #ifndef XMODEM
  329.             case 'u':
  330.                 if(argc>1)
  331.                     goto usage;    /* trap "user 0" */
  332.                 abptr=Wrapped?bufcq+1:bufst;
  333.                 abend=bufcq;
  334.                 /* fall through to T */
  335. #endif /* XMODEM */
  336.             case 't':
  337.                 if(cmdeq(cp, "ype")){
  338. #ifdef XMODEM
  339.                     Type++;    /* send to remote user */
  340. #endif /* XMODEM */
  341.                     goto listit;
  342.                 }
  343. #ifndef RESTRICTED
  344.                 if (cmdeq(cp,"est")) {
  345.                     linetest(atoi(cp += 3));
  346.                     continue;
  347.                 }
  348. #endif /* RESTRICTED */
  349. #ifndef XMODEM 
  350.                 if(--argc > 0) {
  351.                     dumprxbuff(); closerx(TRUE);
  352.                     if(opencapt(*argp++)==ERROR)
  353.                         goto usage;
  354.                 }
  355.                 switch(setval(~0)) {
  356.                 case ERROR:
  357.                     goto usage;
  358.                 case OK:
  359.                     term();
  360.                 case TRUE:
  361.                     /* remain in command mode if t..c  */
  362.                     break;
  363.                 }
  364.                 continue;
  365.             /* note: case u precedes T */
  366.             case 'w':
  367.                 dumprxbuff(); continue;
  368. #endif /* XMODEM */
  369.             case 'x':
  370.                 continue;    /* in case you said "XMODEM" */
  371.             case 0:
  372.             default:
  373.                 goto usage;
  374.             }
  375.             continue;
  376.  
  377.         }
  378.         continue;
  379. usage:
  380.         printf("Type HELP for instructions\n");
  381.         nextcmd=argc=0; continue;
  382.  
  383.     }
  384. }
  385.  
  386. chkbvq()
  387. {
  388.     while(*cp)
  389.         switch(*cp++) {
  390.         case 'b':
  391.             Batch=TRUE; break;
  392.         case 'c':
  393.             Crcflg=TRUE; break;
  394.         case 'q':
  395.             Quiet=TRUE; break;
  396. #ifndef RESTRICTED
  397.         case 't':
  398.             Gototerm=TRUE; break;
  399.         case 'v':
  400.             View=TRUE; break;
  401.         case 'y':
  402.             Creamfile=TRUE; break;
  403. #endif /* RESTRICTED */
  404.         default:
  405.             return ERROR;
  406.         }
  407.     return FALSE;
  408. }
  409. setval(value)
  410. unsigned value;
  411. {
  412.     FLAG dumped;
  413.     dumped=FALSE;
  414.     while(*cp)
  415.         switch(*cp++) {
  416.         case 'a':
  417.             Chat = value;
  418.             break;
  419.         case 'b':
  420.             Txeoln= value&TX_BINARY;
  421.             Txmoname="BINARY";
  422.             break;
  423.         case 'c':
  424.             dumprxbuff();
  425.             closerx(dumped=TRUE);
  426.             break;
  427.         case 'd':
  428.             Dumping = !Squelch || value;
  429.             break;
  430.         case 'e':
  431.             Echo=value;
  432.             break;
  433.         case 'f':
  434.             Hdx= !value;
  435.             break;
  436.         case 'g':
  437.             Txgo= value;
  438.             break;
  439.         case 'h':
  440.             Hdx=value;
  441.             break;
  442.         case 'i':
  443.             Image=value;
  444.             break;
  445.         case 'l':
  446.             Pflag=value;
  447.             break;
  448.         case 'n':
  449.             Txeoln =value&EOL_NL;
  450.             Txmoname="NL ONLY";
  451.             break;
  452.         case 'o':
  453.             Pflag= !value;
  454.             break;
  455.         case 'p':
  456.             Txeoln =value&EOL_CRPROMPT;
  457.             Txmoname="WAIT FOR PROMPT";
  458.             break;
  459.         case 'r':
  460.             Txeoln =value&EOL_CR;
  461.             Txmoname="CR ONLY";
  462.             break;
  463.         case 's':
  464.             Squelch=value;
  465.             break;
  466.         case 't':
  467.             Waitbunch=value;
  468.             break;
  469.         case 'v':
  470.             Ctlview++;
  471.             break;
  472.         case 'w':
  473.             Txeoln= value&EOL_CRWAIT;
  474.             Txmoname="CR WAIT FOR NL";
  475.             break;
  476.         case 'x':
  477.             Exoneof=value;
  478.             break;
  479.         case 'z':
  480.             Zeof=value;
  481.             break;
  482.         default:
  483.             return ERROR;
  484.         }
  485.     return dumped;
  486. }
  487.  
  488. init()
  489. {
  490. #ifdef BDSC
  491.     char *endext(), *topofmem(), *codend(), *externs();
  492.     if(codend() > externs()) {    /* check for bad -e value! */
  493.         printf("urk"); exit();
  494.     }
  495. #endif /* BDSC */
  496. #ifdef USERINIT
  497.     userinit();    /* allows extra user externs' to be initialized */
  498. #endif /* USERINIT */
  499.     initdd();        /* fetch default disk and user number */
  500.     bufst=endext();
  501.     bufend=topofmem()-1024;    /* fudge so we don't crash ... */
  502.     Dport=DPORT; Sport=SPORT;
  503. #ifndef DEFBAUD
  504.     readbaud();
  505. #else
  506.     Baudrate=DEFBAUD;
  507. #endif /* DEFBAUD */
  508. #ifdef INITBAUD
  509.     setbaud(Baudrate);
  510. #endif /* INITBAUD */
  511.     Mstatus=0;    
  512.     Rfile=Tfile=Pflag=FALSE;
  513.     Image=Waitbunch=Exoneof=Hdx=Zeof=Squelch=FALSE;
  514.     Txgo=TRUE;
  515.     Parity= NORMAL;
  516.     Originate= TRUE;
  517.     Txeoln= EOL_NOTHING;
  518.     Low= 400;
  519.     Tpause=1500*CLKMHZ;
  520.     Throttle=80*CLKMHZ;
  521.     T1pause=311*CLKMHZ;
  522.     Waitnum=1;
  523.     GOchar= '\n';
  524.     clearbuf();
  525. }
  526.  
  527. clearbuf()
  528. {
  529.     abptr=NULL;
  530.     Xoffflg=Wrapped= FALSE;
  531.     buffcdq=bufcq=bufcdq=bufpcdq=bufmark= bufst;
  532.     Bufsize=Free= bufend-bufst-1;
  533. }
  534.  
  535.  
  536. cmdeq(s,p)
  537. char *s, *p;
  538. {
  539.     while(*p)
  540.         if(*s++ != *p++)
  541.             return 0;
  542.     return 1;
  543. }
  544.  
  545. dostat()
  546. {
  547.  
  548.     printf("Capture %s Receiving %s ",
  549.       Dumping?"ON":"SQUELCHED", Rfile?Rname:"<nil>");
  550.     if(Image)
  551.         printf("Transparency mode ");
  552.     if(Squelch)
  553.         printf("^R ^T Squelch ");
  554.     if(Zeof)
  555.         printf("EOF on ^Z");
  556.     printf("\n");
  557.  
  558.     if(Txeoln==EOL_NOTHING)
  559.         Txmoname="IMAGE";
  560.  
  561.     printf("%sSending %s in %s mode\n",
  562.       Txgo? "" : "Pausing in ", Tfile?Tname:"<nil>", Txmoname);
  563.     printf("%sWaiting %d loops every %u chars  Pause=%u GOchar=0%o\n",
  564.       Waitbunch?"":"NOT ",Throttle, Waitnum, Tpause, GOchar);
  565.  
  566.     printf("Printer %s  ", Pflag?"ON":"OFF");
  567.     if(Hdx)
  568.         printf("Half Duplex ");
  569.     printf("At %u baud data port %u\n", Baudrate, Dport);
  570.     printf("%u of %u chars used %u free%s\n",
  571.       Bufsize-Free, Bufsize, Free, Wrapped?" POINTERS WRAPPED":"");
  572.     printf("bufst=%x bufcq=%x bufcdq=%x\nbuffcdq=%x bufpcdq=%x bufend=%x\n",
  573.       bufst, bufcq, bufcdq, buffcdq, bufpcdq, bufend);
  574. #ifndef CDOS
  575.     printdfr();
  576. #endif /* CDOS */
  577. }
  578.  
  579. isgraphic(c)
  580. {
  581.     if(c>' ' && c<0177)
  582.         return TRUE;
  583.     else
  584.         return FALSE;
  585. }
  586.  
  587. /*
  588.  * index returns a pointer to the first occurrence of c in s,
  589.  * NULL otherwise.
  590.  */
  591. char *index(c, s)
  592. char c,*s;
  593. {
  594.     for(; *s; s++)
  595.         if(c== *s)
  596.             return s;
  597.     return NULL;
  598. }
  599. psxfer(status)
  600. {
  601.     lpstat("\007File transfer(s) %s\007",
  602.      status==ERROR?"ABORTED BY ERROR" : "successful");
  603. #ifndef CDOS
  604.     printdfr();
  605. #endif /* CDOS */
  606. }
  607.  
  608. setparm(p)
  609. char *p;
  610. {
  611.     if(*p)
  612.         switch(*p++) {
  613.         case 'g':
  614.             if((GOchar= *p) == '^')
  615.                 GOchar= (*++p & 037);
  616.             break;
  617.         case 'l':
  618.             Low=atoi(p);
  619.             break;
  620.         case 'p':
  621.             Tpause=atoi(p);
  622.             break;
  623.         case 't':
  624.             Throttle=atoi(p);
  625.             break;
  626.         case 'w':
  627.             Waitnum=atoi(p);
  628.             break;
  629.         default:
  630.             return ERROR;
  631.      }
  632.     return 0;
  633. }
  634. /* make strings lower case */
  635. uncaps(s)
  636. char *s;
  637. {
  638.     while(*s)
  639.         *s = tolower(*s++);
  640. }
  641.  
  642. /* end of YAM1.C */
  643.