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 / ENTERPRS / CPM / TERMS / ZMP-SRC.LZH / ZMP2.C < prev    next >
Text File  |  2000-06-30  |  8KB  |  426 lines

  1. /*            MAIN module File #2                */
  2.  
  3. #include "zmp.h"
  4.  
  5. #ifdef   AZTEC_C
  6. #include "libc.h"
  7. #else
  8. #include <stdio.h>
  9. #endif
  10.  
  11.  
  12. fstat(fname,status)
  13. char *fname;
  14. struct stat *status;
  15. {
  16.    unsigned filelength();
  17.  
  18.    fcbinit(fname,&Thefcb);
  19.    status->records = filelength(&Thefcb);
  20.    getfirst(fname);
  21.    fcbinit("????????.???",&Thefcb);
  22. }
  23.  
  24. unsigned
  25. filelength(fcbp)
  26. struct fcb *fcbp;
  27. {
  28.    int olduser;
  29.  
  30.    bdos(SETDMA,CPMBUF);         /* set dma address */
  31.    olduser = getuid();        /* save this user number */
  32.    setuid(fcbp->freserved & 0x0f);    /* go to file's user no. */
  33.    bdos(35,fcbp);
  34.    setuid(olduser);        /* restore original */
  35.    return fcbp->ranrec;
  36. }
  37.  
  38. roundup(dividend,divisor)
  39. int dividend, divisor;
  40. {
  41.    return (dividend/divisor + ((dividend%divisor) ? 1 : 0));
  42. }
  43.  
  44. getfirst(aname)      /* ambiguous file name */
  45. char *aname;
  46. {
  47.    bdos(SETDMA,CPMBUF);         /* set dma address */
  48.    fcbinit(aname,&Thefcb);
  49.    return bdos(SFF,&Thefcb) & 0xff;
  50. }
  51.  
  52. getnext()
  53. {
  54.    bdos(SETDMA,CPMBUF);         /* set dma address */
  55.    return bdos(SFN,NULL) & 0xff;
  56. }
  57.  
  58. memcpy(dest,source,count)
  59. char *dest, *source;
  60. int count;
  61. {
  62.    while (count--)
  63.       *dest++ = *source++;
  64. }
  65.  
  66. memset(dest,byte,count)
  67. char *dest, byte;
  68. int count;
  69. {
  70.    while (count--)
  71.       *dest++ = byte;
  72. }
  73.  
  74. /* command: expand wild cards in the command line.  (7/25/83)
  75.  * usage: command(&argc, &argv) modifies argc and argv as necessary
  76.  * uses sbrk to create the new arg list
  77.  * NOTE: requires fcbinit() and bdos() from file stdlib.c.  When used
  78.  *    with a linker and stdlib.rel, remove the #include stdlib.c.
  79.  *
  80.  * Written by Dr. Jim Gillogly; Modified for CP/M by Walt Bilofsky.
  81.  * Modified by HM to just get ambiguous fn for zmodem, ymodem.
  82.  */
  83.  
  84. int COMnf,*COMfn,COMc,*COMv;
  85. char *COMarg,*COMs;
  86. static expand();
  87.  
  88. command(argcp,argvp)
  89. int *argcp,*argvp;
  90. {
  91.     char *p, c;
  92.     int f_alloc[MAXFILES];
  93.  
  94.     COMfn = f_alloc;
  95.     COMc = *argcp;
  96.     COMv = *argvp;
  97.     COMnf = 0;
  98.     for (COMarg = *COMv; COMc--; COMarg = *++COMv) {
  99.  
  100. #ifdef   DEBUG
  101.         printf("\nDoing %s",COMarg);
  102. #endif
  103.  
  104.         for (COMs = COMarg; *COMs; COMs++)
  105.             if (*COMs == '?' || *COMs == '*') {    
  106.                 if (!expand()) {    /* Too many */
  107.                     *argcp = 0;
  108.                     return;
  109.                 }
  110.                 goto contn;  /* expand each name at most once */
  111.             }
  112.         COMfn[COMnf] = alloc(FNSIZE);
  113.         p = COMarg;
  114.         while (c = *p)            /* Convert to lower case */
  115.             *p++ = tolower(c);
  116.         strcpy(COMfn[COMnf++],COMarg);     /* no expansion */
  117. contn:;
  118.     }
  119.     *argcp = COMnf;
  120.     COMfn[COMnf++] = -1;
  121.     COMv = *argvp = alloc(2 * COMnf);
  122.     while (COMnf--) 
  123.         COMv[COMnf] = COMfn[COMnf];
  124. }
  125.  
  126. static expand()        /* Returns FALSE if error */
  127. {
  128.     char fcb[36];
  129.     static char *p,*q,*r,c;
  130.     static int i,flg,olduser;
  131.  
  132. #ifdef   DEBUG
  133.    printf("\nExpanding %s",COMarg);
  134. #endif
  135.     olduser = getuid();            /* save original user area */
  136.     fcbinit(COMarg,fcb);
  137.     if (fcb[0] == -1) 
  138.     fcb[0] = '?';                 /* Check for all users */
  139.     for (i = flg = 1; i <= 11; ++i) {    /* Expand *'s */
  140.         if (i == 9) 
  141.                 flg = 1;
  142.         if (fcb[i] == '*') 
  143.                 flg = 0;
  144.         if (flg == 0) 
  145.             fcb[i] = '?'; 
  146.     }
  147.     setuid(fcb[13]);        /* go to specified user area */
  148.     flg = 17;
  149.     bdos(26,0x80);                /* Make sure DMA address OK */
  150.     while (((i = bdos(flg,fcb)) & 0xff) != 0xff) {
  151.         COMfn[COMnf++] = q = alloc(FNSIZE);
  152.         if (COMnf >= MAXFILES-1) {
  153.             for (p = "Too many file names.\n"; putchar(*p++); ); {
  154.                 setuid(olduser);
  155.                 return FALSE;
  156.             }
  157.         }
  158.         p = 0x81 + i * 32;        /* Where to find dir. record */
  159.         /* transfer du: first */
  160.         if ((index(COMarg,':')) && COMarg[0] != '?') {
  161.             r = COMarg;
  162.             do
  163.                 *q++ = c = *r++;
  164.                     while (c != ':');
  165.               }
  166.         /* Now transfer filename */
  167.         for (i = 12; --i; ) {
  168.             if (i == 3) 
  169.                         *q++ = '.';
  170.             if ((*q = tolower(*p++ & 0177)) != ' ') 
  171.                     ++q; 
  172.               }
  173.         *q = 0;
  174.         flg = 18;
  175.     }
  176.     setuid(olduser);
  177.     return TRUE;
  178. }
  179.  
  180. ctr(p)
  181. char *p;
  182. {
  183.    return max((80 - strlen(p))/2,0);
  184. }
  185.  
  186. opabort()
  187. {
  188.    Lastkey = getch() & 0xff;
  189.    if (Lastkey == ESC) {
  190.       flush();
  191.       if (!Inhost && !Dialing)
  192.          report(MESSAGE,"Operator abort");
  193.       QuitFlag = TRUE;
  194.    }
  195.    return QuitFlag;
  196. }
  197.  
  198. /*
  199.  * readock(timeout, count) reads character(s) from modem
  200.  *  (1 <= count <= 3)
  201.  * it attempts to read count characters. If it gets more than one,
  202.  * it is an error unless all are CAN
  203.  * (otherwise, only normal response is ACK, CAN, or C)
  204.  *
  205.  * timeout is in tenths of seconds
  206.  */
  207.  
  208. readock(timeout, count)
  209. int timeout, count;
  210. {
  211.     static int c;
  212.     static char byt[5];
  213.  
  214.     c = mread(byt,count,timeout);
  215.     if (c < 1)
  216.         return TIMEOUT;
  217.     if (c == 1)
  218.         return (byt[0] & 0xff);
  219.     else
  220.         while (c)
  221.            if (byt[--c] != CAN)
  222.                return NERROR;
  223.     return CAN;
  224. }
  225.  
  226. readline(n)
  227. int n;
  228. {
  229.     return (readock(n,1));
  230. }
  231.  
  232. putlabel(string)
  233. char string[];
  234. {
  235.    cls();
  236.    locate(0,ctr(string) - 1);    /* Centre on top line */   
  237.    stndout();            /* Inverse video */
  238.    printf(" %s \n\n",string);    /* Print the string */
  239.    stndend();            /* Inverse off */
  240. }
  241.  
  242. killlabel() /*disable 25th line*/
  243. {
  244.    cls();            /* just clear screen */
  245. }
  246.  
  247. mgetchar(seconds)         /* allows input from modem or operator */
  248. int seconds;
  249. {
  250.    static int c, tenths;
  251.  
  252.    Lastkey = 0;
  253.    tenths = seconds * 10;
  254.    if ((c=readline(tenths)) != TIMEOUT)
  255.       return (c & 0xff);
  256.    else if (Lastkey)
  257.       return Lastkey;
  258.    return TIMEOUT;
  259. }
  260.  
  261. #ifdef AZTEC_C
  262. /* Dummy routine to allow long arithmetic in overlays */
  263. dummylong()
  264. {
  265.     long a = 1L;
  266.  
  267.     a = a * 2L;
  268. }
  269. #endif
  270.  
  271. box()          /* put box on screen for file transfer */
  272. {
  273.     register int i;
  274.     static char *headings[] = { "","Protocol:","File Name:","File Size:",
  275.                 "Block Check:","Transfer Time:",
  276.                 "Bytes Transferred:","Blocks Transferred:",
  277.                 "Sectors in File:","Error Count:",
  278.                 "Last Message:  NONE" };
  279.     static int start[] = { 0,13+LC,12+LC,12+LC,10+LC,8+LC,4+LC,3+LC,6+LC,
  280.                 10+LC,9+LC };
  281.  
  282.     LOCATE(TR,LC);
  283.     putchar(UL);
  284.     for (i = 1; i < WD-1; i++)
  285.         putchar(HORIZ);
  286.     putchar(UR);
  287.     LOCATE(BR,LC);
  288.     putchar(LL);
  289.     for (i = 1; i < WD-1; i++)
  290.         putchar(HORIZ);
  291.     putchar(LR);
  292.     for (i = 1; i < HT-1; i++) {
  293.         LOCATE(TR+i,LC);
  294.         putchar(VERT);
  295.         LOCATE(TR+i,RC);
  296.         putchar(VERT);
  297.     }
  298.     clrbox();
  299.     for (i=1; i<11; i++) {
  300.     locate(TR+i,start[i]);
  301.     printf(headings[i]);
  302.    }   
  303. }
  304.  
  305. clrbox()
  306. {
  307.    register int i;
  308.  
  309.    for (i=TR+1; i < BR; i++) {
  310.       locate(i,LC+1);
  311.       printf("                                       ");
  312.    }
  313. }
  314.  
  315. mread(buffer, count, timeout)    /* time in tenths of secs */
  316. char *buffer;
  317. int count, timeout;
  318. {
  319.     int i, c;
  320.  
  321.     i = 0;
  322.     while (!(c = mrd()) && (timeout--) && !opabort());
  323.     if (c)
  324.         buffer[i++] = mcharinp();
  325.     return i;
  326. }
  327.  
  328. mcharinp()
  329. {
  330.     static unsigned c;
  331.  
  332.     c = mchin();
  333.     if (Stopped)
  334.     {
  335.         mchout(CTRLQ);
  336.         Stopped = FALSE;
  337.     }
  338.     return c;
  339. }
  340.  
  341. mcharout(c)
  342. char c;
  343. {
  344.     while (!moutrdy())
  345.         opabort();    /* Test for operator abort while we wait */
  346.     mchout(c);        /* Then send it */
  347. }
  348.  
  349. minprdy()
  350. {
  351.     return mirdy() || Stopped;
  352. }
  353.  
  354. #ifdef AZTEC_C
  355. /* Overlay for system-specific functions goes here */
  356.  
  357.  #asm        /* Remove leading space! */
  358.  
  359.     public    userdef
  360.     public    screenpr,mrd_,mchin_,mchout_,mirdy_
  361.     public    sendbrk_,locate_,cls_,stndout_
  362.     public    stndend_,hidecurs,showcurs,savecurs,restcurs
  363.     public    minterru,initvect,deinitve,mdmerror,dtron_
  364.     public    dtroff_,initace_,wait_,mswait_
  365.  
  366. userdef:        ; Marker so we know where the overlay starts
  367.  
  368. ;Organise as jump table for the overlay
  369.  
  370. screenpr:
  371.     jmp    ovret
  372. mrd_:
  373.     jmp    ovret
  374. mchin_:
  375.     jmp    ovret
  376. mchout_:
  377.     jmp    ovret
  378. moutrdy_:
  379.     jmp    ovret
  380. mirdy_:
  381.     jmp    ovret
  382. sendbrk_:
  383.     jmp    ovret
  384. locate_:
  385.     jmp    ovret
  386. cls_:
  387.     jmp    ovret
  388. stndout_:
  389.     jmp    ovret
  390. stndend_:
  391.     jmp    ovret
  392. hidecurs:
  393.     jmp    ovret
  394. showcurs:
  395.     jmp    ovret
  396. savecurs:
  397.     jmp    ovret
  398. restcurs:
  399.     jmp    ovret
  400. minterru:
  401.     jmp    ovret
  402. initvect:
  403.     jmp    ovret
  404. deinitve:
  405.     jmp    ovret
  406. mdmerror:
  407.     jmp    ovret
  408. dtron_:
  409.     jmp    ovret
  410. dtroff_:
  411.     jmp    ovret
  412. initace_:
  413.     jmp    ovret
  414. wait_:
  415.     jmp    ovret
  416. mswait_:
  417.     jmp    ovret
  418.  
  419. ovret:    ret            ; Nothing installed yet
  420.  
  421.     ds    0400h        ; Allow room for overlay
  422.  
  423.  #endasm        /* Remove leading space! */
  424.  
  425. /*             End of MAIN module                 */
  426.