home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol158 / yam1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1984-04-29  |  11.7 KB  |  646 lines

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