home *** CD-ROM | disk | FTP | other *** search
/ Micro R&D 1 / MicroRD-CD-ROM-Vol1-1994.iso / os20 / cli / randomcopy.lha / randomcopy.e < prev    next >
Encoding:
Text File  |  1993-12-23  |  5.0 KB  |  262 lines

  1.  
  2. /*      Randomcopy.e      COPYRIGHT 1992 by Chad Randall (crandall)  */
  3.  
  4.  
  5. MODULE 'dos/dos','dos/dosextens','dos/dosasl'
  6.  
  7. DEF argstr[500]:STRING
  8. DEF source[150]:STRING
  9. DEF dest[150]:STRING
  10. DEF work[150]:STRING
  11. DEF work2[150]:STRING
  12. DEF waittime=NIL
  13.  
  14. DEF pos,i,quietflag,cloneflag,posflag,error,fail,seconds,micros,random,dd
  15.  
  16. CONST AOK=69            /*  GRIN  8->  */
  17. CONST NOT_AOK=666  /*  Just a joke... or is it?  >:">  */
  18.  
  19. PROC main()
  20.  
  21.     IF KickVersion(37)=NIL
  22.         WriteF('\nGet OS2.x (maybe a nice A1200?)\n')
  23.         RETURN
  24.     ENDIF
  25.  
  26.  
  27.     CurrentTime({seconds},{micros})
  28.     
  29.     random:=RndQ(seconds)
  30.  
  31.     /* An attempt to get a pseudo-randomized number! */
  32.  
  33.     FOR i:=0 TO micros/1000
  34.         dd:=Rnd(i)
  35.     ENDFOR
  36.  
  37.  
  38.     StrCopy(argstr,arg,ALL)
  39.  
  40.     WHILE (pos:=parsenext(pos))
  41.         StrCopy(work2,work,ALL)
  42.         UpperStr(work2)
  43.         IF (StrCmp(work2,'QUIET',ALL))
  44.             quietflag:=TRUE
  45.         ELSE
  46.             IF (StrCmp(work2,'CLONE',ALL))
  47.                 cloneflag:=TRUE
  48.             ELSE
  49.                 IF (StrCmp(work2,'FROM',ALL))
  50.                     IF (pos:=parsenext(pos))
  51.                         StrCopy(source,work,ALL)
  52.                         posflag:=TRUE
  53.                     ELSE
  54.                         error:=15
  55.                     ENDIF
  56.                 ELSE
  57.                     IF (StrCmp(work2,'TO',ALL))
  58.                         IF (pos:=parsenext(pos))
  59.                             StrCopy(dest,work,ALL)
  60.                             posflag:=AOK
  61.                         ELSE
  62.                             error:=15
  63.                         ENDIF
  64.                     ELSE
  65.                         IF (StrCmp(work2,'?',ALL))
  66.                             commandline()
  67.                         ELSE
  68.                             IF (StrCmp(work2,'ABOUT',ALL))
  69.                                 instructions()
  70.                             ELSE
  71.                                 IF posflag=NIL
  72.                                     StrCopy(source,work,ALL)
  73.                                     posflag:=TRUE
  74.                                 ELSE
  75.                                     IF posflag=AOK
  76.                                         error:=15
  77.                                         posflag:=NOT_AOK
  78.                                     ELSE
  79.                                         StrCopy(dest,work,ALL)
  80.                                         posflag:=AOK
  81.                                     ENDIF
  82.                                 ENDIF
  83.                             ENDIF
  84.                         ENDIF
  85.                     ENDIF
  86.                 ENDIF
  87.             ENDIF
  88.         ENDIF
  89.     ENDWHILE
  90.  
  91.     IF (error) 
  92.         IF quietflag=NIL
  93.             WriteF('randomcopy: too many arguments\n')
  94.         ENDIF
  95.     ELSE
  96.         IF ((posflag=NIL) OR (posflag=TRUE))
  97.             IF quietflag=NIL
  98.                 WriteF('randomcopy: required argument missing\n')
  99.             ENDIF
  100.         ELSE    
  101.             IF (posflag=AOK)
  102.                 docopy()
  103.             ENDIF
  104.         ENDIF
  105.     ENDIF
  106.  
  107. ENDPROC error
  108.  
  109. PROC docopy()
  110.     DEF lock=NIL:PTR TO filelock,fileinfo=NIL:PTR TO fileinfoblock
  111.     DEF apath=NIL:PTR TO anchorpath,achain=NIL:PTR TO achain
  112.     DEF err,pathlen,filestart,first,chance=1
  113.  
  114.     filestart:=FilePart(source)
  115.     pathlen:=filestart-source
  116.     IF (pathlen)
  117.         StrCopy(work,source,pathlen)
  118.     ELSE
  119.         StrCopy(work,'',ALL)
  120.     ENDIF
  121.  
  122.     apath:=New(SIZEOF anchorpath)
  123. /*    fileinfo:=New(SIZEOF fileinfoblock) */
  124.  
  125.     err:=NIL;first:=FALSE
  126.     WHILE err=NIL
  127.         IF first=FALSE
  128.             err:=MatchFirst(source,apath)
  129.             first:=TRUE
  130.         ELSE
  131.             err:=MatchNext(apath)
  132.         ENDIF
  133.         IF (err)
  134.             IF (err=ERROR_NO_MORE_ENTRIES)
  135.                 IF chance>1
  136.                     copyfile()
  137.                 ELSE
  138.                     printerror(ERROR_NO_MORE_ENTRIES)
  139.                 ENDIF
  140.             ELSE
  141.                 printerror(err)
  142.             ENDIF
  143.         ELSE
  144.             achain:=apath.last
  145.             IF (achain)
  146.                 fileinfo:=achain.info
  147.                 IF (fileinfo.direntrytype)<0
  148.                     IF (fileinfo)
  149.                         IF(Rnd(chance))=NIL
  150.                             StrCopy(work2,fileinfo.filename,ALL)
  151.                         ENDIF
  152.                         chance:=chance+1
  153.                     ENDIF
  154.                 ENDIF
  155.             ENDIF
  156.         ENDIF
  157.     ENDWHILE
  158.  
  159.     MatchEnd(apath)
  160.  
  161. ENDPROC
  162.  
  163. PROC copyfile()
  164.     DEF    filesize,workfh=NIL:PTR TO filehandle,
  165.             destfh=NIL:PTR TO filehandle
  166.     DEF b,cont=FALSE,numbytes,buffer,numbytes2
  167.  
  168.     buffer:=New(512)
  169.     StrAdd(work,work2,ALL)
  170.     IF quietflag=NIL
  171.         WriteF('Copying \s TO \s\n',work,dest)
  172.     ENDIF
  173.     IF(filesize:=FileLength(work))>0
  174.         IF (workfh:=Open(work,MODE_OLDFILE))
  175.             IF (destfh:=Open(dest,MODE_NEWFILE))
  176.                 WriteF('Opened dest!')
  177.                 WHILE cont=FALSE
  178.                     numbytes:=Read(workfh,buffer,512)
  179.                     WriteF('READ')
  180.                     IF numbytes=-1
  181.                         printerror(b:=IoErr())
  182.                         cont:=TRUE
  183.                     ELSE
  184.                         IF numbytes=0
  185.                             cont:=TRUE
  186.                         ELSE
  187.                             numbytes2:=Write(destfh,buffer,numbytes)
  188.                             WriteF('WRITE')
  189.                             IF numbytes<512
  190.                                 cont:=TRUE
  191.                             ENDIF
  192.                         ENDIF
  193.                     ENDIF
  194.                 ENDWHILE                
  195.             ELSE
  196.                 printerror(b:=IoErr())
  197.             ENDIF
  198.         ELSE
  199.             printerror(b:=IoErr())
  200.         ENDIF
  201.     ELSE
  202.         printerror(b:=IoErr())
  203.     ENDIF
  204.     IF (destfh) THEN Close(destfh)
  205.     IF (workfh) THEN Close(workfh)
  206.  
  207. ENDPROC
  208.  
  209. PROC printerror(errn)
  210.     DEF ebuf[140]:STRING,head[100]:STRING,a
  211.  
  212.     StrCopy(head,'Randomcopy failed',ALL)
  213.     IF (a:=Fault(errn,head,ebuf,140))=NIL
  214.         WriteF('Randomcopy error.\n')
  215.     ELSE
  216.         IF quietflag=NIL
  217.             WriteF('\s\n',ebuf)
  218.         ENDIF
  219.     ENDIF
  220. ENDPROC
  221.  
  222. PROC commandline()
  223.     IF quietflag=NIL
  224.         WriteF('\nFROM\\A TO\\A QUIET\\S CLONE\\S ABOUT\\S\n')
  225.     ENDIF
  226. ENDPROC
  227.  
  228. PROC instructions()
  229.     IF quietflag=NIL
  230.         WriteF('\nRandomcopy  version .5  December 22, 1993.\n')
  231.         WriteF('This program is copyright ®1993 by Chad Randall\n')
  232.         WriteF('and may be freely distributed.\n')
  233.         WriteF('\n')
  234.         WriteF('  EMAIL:crandall@garnet.msen.com\n')
  235.         WriteF(' USNAIL:Chad Randall, 229 S.Washington St.,\n')
  236.         WriteF('        Manchester, Michigan 48158-9680, USA.\n')
  237.         WriteF('\n')
  238.  
  239.     ENDIF
  240. ENDPROC
  241.  
  242. PROC parsenext(x)
  243.     DEF lpos,lastpos
  244.     FOR lpos:=x TO StrLen(argstr)
  245.         MidStr(work,argstr,lpos,1)
  246.         IF ((StrCmp(work,' ',ALL)) OR (lpos=StrLen(argstr)))
  247.             MidStr(work,argstr,x,lpos-x)
  248.             lastpos:=lpos
  249.             lpos:=2000
  250.         ENDIF
  251.     ENDFOR
  252.     IF (lpos<2000)
  253.         lpos:=0
  254.     ELSE
  255.         lpos:=lastpos+1
  256.     ENDIF
  257. ENDPROC lpos
  258.  
  259. PROC version()
  260.     WriteF('\n$VER: randomcopy 0.5 (22.12.93)\n')
  261. ENDPROC
  262.