home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / c128 / c8filcpy.lbr / FILECOPY.CQ / FILECOPY.C
Text File  |  1986-08-13  |  4KB  |  183 lines

  1. #include "fcntl.h"
  2. #include "stdio.h"
  3. #define tpa_plus_one *((int *)6)
  4. main()
  5.     {
  6.     char *buffer,*dma;
  7.     char filename[129][15];
  8.     unsigned filestart[129];
  9.     char tempname[15];
  10.     int lastfile,doread,readfile,writefile,rfd,wfd;
  11.     unsigned size,rndex;
  12.     int response,assumed,echo,halfbuf;
  13.     unsigned maxbuf;
  14.     unsigned i;
  15.  
  16.     dma=alloc(128);
  17.     maxbuf = (unsigned)tpa_plus_one - ((unsigned)dma+128) - (unsigned)4000;
  18.     maxbuf &= 0xff00;
  19.     halfbuf=(maxbuf>>1)&0x7fff;
  20.     buffer=alloc(halfbuf);
  21.     alloc(halfbuf);
  22.  
  23.     fputs("\n\t\t\tSINGLE DRIVE FILE COPY UTILITY\n\n",stdout);
  24.     fputs("\t\tInsert SOURCE DISK when prompted for disk E:\n",stdout);
  25.     fputs("\t\tInsert DESTINATION DISK when prompted for disk A:\n\n",
  26.                                 stdout);
  27.  
  28.     bdos(0xe,0); /*select drive a*/
  29.     bdos(0xd,0); /*reset*/
  30.     bdos(0x1a,dma); /*set dma address*/
  31.  
  32.     *buffer=5;
  33.     for(i=1;i<12;i++)*(buffer+i)='?';
  34.     *(buffer+12)=0;
  35.     i=bdos(0x11,buffer);
  36.     if(i==255)exit(1);
  37.     lastfile=0;
  38.     strcpy(&filename[lastfile++][0],dma+1+32*i);
  39.  
  40.     while(i!=255)
  41.         {
  42.         i=bdos(0x12,0);
  43.         if(i!=255)strcpy(&filename[lastfile++][0],dma+1+32*i);
  44.         }
  45.  
  46.     fputs("Respond to each file name with:\n",stdout);
  47.     fputs("         y - yes, copy this file\n",stdout);
  48.     fputs("         n - no, don't copy this file\n",stdout);
  49.     fputs("  <return> - respond to remaining files the same way\n\n",
  50.                                 stdout);
  51.     response=0;
  52.     echo='y';
  53.     assumed='E';
  54.     for(i=0;i<lastfile;i++)
  55.         {
  56.         tempname[0]='E';
  57.         tempname[1]=':';
  58.         strncpy(&tempname[2],&filename[i][0],8);
  59.         tempname[10]='.';
  60.         strncpy(&tempname[11],&filename[i][8],3);
  61.         tempname[14]=0;
  62.  
  63.         fputs(&tempname[2],stdout);
  64.         fputs("    ? ",stdout);
  65.         if(response!='\r')
  66.             {
  67.             while((response=bdos(6,0xff))!='y' && response!='n' &&
  68.                     response!='\r');
  69.             }
  70.         if(response=='n')
  71.             {
  72.             assumed=tempname[0]='X';
  73.             putchar(echo='n');
  74.             }
  75.         else if(response=='y')
  76.             {
  77.             assumed='E';
  78.             putchar(echo='y');
  79.             }
  80.         else
  81.             {
  82.             tempname[0]=assumed;
  83.             putchar(echo);
  84.             }
  85.         putchar('\n');
  86.  
  87.         strncpy(&filename[i][0],tempname,15);
  88.         }
  89.  
  90.     putchar('\n');
  91.     filename[lastfile][0]=0;
  92.     rndex=0;
  93.     readfile=0;
  94.     writefile=0;
  95.     doread=1;
  96.     rfd=0;
  97.     wfd=0;
  98.     for(;;)
  99.         {
  100.         if(doread)
  101.             {
  102.             if(!rfd)
  103.                 {
  104.                 if(filename[readfile][0] != 'X')
  105.                     {
  106.                     filename[readfile][0]='E';
  107.                     rfd=open(&filename[readfile][0],
  108.                         O_RDONLY);
  109.                     fputs(&filename[readfile][2],stdout);
  110.                     fputs("        ",stdout);
  111.                     }
  112.                 filestart[readfile]=rndex;
  113.                 }
  114.             size=0;
  115.             if(rfd)    size=read(rfd,buffer+rndex,maxbuf-rndex);
  116.             if(size!=0 && size!=0xffff)
  117.                 {
  118.                 rndex+=size;
  119.                 if(rndex==maxbuf)
  120.                     {
  121.                     doread=0;
  122.                     filestart[readfile+1]=maxbuf;
  123.                     rndex=0;
  124.                     putchar('\007');
  125.                     }
  126.                 }
  127.             else
  128.                 {
  129.                 if(rfd) close(rfd);
  130.                 rfd=0;
  131.                 if(++readfile == lastfile)
  132.                     {
  133.                     doread=0;
  134.                     filestart[readfile]=rndex;
  135.                     filestart[readfile+1]=rndex;
  136.                     putchar('\007');
  137.                     }
  138.                 }
  139.             }
  140.         else
  141.             {
  142.             if(!wfd)
  143.                 {
  144.                 if(filename[writefile][0] != 'X')
  145.                     {
  146.                     filename[writefile][0]='A';
  147.                     wfd=open(&filename[writefile][0],
  148.                         O_WRONLY|O_CREAT);
  149.                     }
  150.                 }
  151.             if(i=filestart[writefile+1]-filestart[writefile])
  152.                 {
  153.                 if(wfd) write(wfd,buffer+filestart[writefile],
  154.                     i);
  155.                 }
  156.             if(writefile<readfile)
  157.                 {
  158.                 if(wfd) close(wfd);
  159.                 if(++writefile!=readfile || readfile<lastfile)
  160.                     {
  161.                     wfd=0;
  162.                     }
  163.                 else
  164.                     {
  165.                     wfd=3;
  166.                     }
  167.                 }
  168.             else
  169.                 {
  170.                 if(readfile>=lastfile)
  171.                     {
  172.                     close(wfd);
  173.                     exit(0);
  174.                     }
  175.                 doread=1;
  176.                 bdos(0x30,0); /*flush buffers*/
  177.                 filestart[readfile]=0;
  178.                 putchar('\007');
  179.                 }
  180.             }
  181.         }
  182.     }
  183.