home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / QCD.ZIP / QCD.CMD
OS/2 REXX Batch file  |  1991-03-30  |  3KB  |  120 lines

  1. /*********************************************************************\
  2. **  Quick Change Directory - Procedure
  3. **  (C) Copyright Marc J. Greenberg 1991
  4. \*********************************************************************/
  5. ARG CMDLINE
  6. SAY "Quick Change Directory - (C) Copyright Marc J. Greenberg 1991"
  7. IF LENGTH(CMDLINE)=0 THEN SIGNAL HELP
  8. /* Assure all subcommands are issued to the CMD environment */
  9. ADDRESS CMD
  10.  
  11. PARSE VALUE CMDLINE WITH CMDLINE"-"OPTION
  12. IF LENGTH(OPTION)=0 THEN PARSE VALUE CMDLINE WITH CMDLINE"/"OPTION
  13.  
  14. /* chech for help request */
  15. IF POS("?",OPTION) THEN SIGNAL HELP
  16.  
  17. /* Change to requested drive if specified */
  18. "@"FILESPEC("DRIVE",CMDLINE)
  19.  
  20. /* Get the name of the requested directory destination */
  21. DEST=FILESPEC("NAME",CMDLINE)
  22. IF LENGTH(DEST)=0 THEN DEST=FILESPEC("PATH",CMDLINE)
  23.  
  24. /* If the destination is the root then change to it immediatly and exit */
  25. IF DEST='\' THEN DO;'@CD \';EXIT;END
  26.  
  27. /* Set up Disk Map file variables */
  28. DRIVE=FILESPEC("DRIVE",DIRECTORY())
  29. DIREC=SUBSTR(DIRECTORY(),LENGTH(DRIVE)+1)
  30. MFILE=DRIVE||"\DISK.MAP"
  31.  
  32. /* Check that the DISK.MAP file exists, if not create it */
  33. IF (STREAM(MFILE,C,'QUERY EXISTS')="" )|(POS("S",OPTION)>0) THEN CALL SCANDRIVE
  34.  
  35. /* Initialize variables, read the diskmap file and close it*/
  36. LLEFT=""
  37. DTREE=LINEIN(MFILE)
  38. CTREE=DTREE
  39. CALL STREAM MFILE,C,'CLOSE'
  40. IF POS("G",OPTION)>0 THEN DO; CALL GRAPHTREE; EXIT; END
  41. IF LENGTH(DEST)=0 THEN EXIT
  42.  
  43. /* Start Search from the current directory */
  44. IF DIREC\='\' THEN DO WHILE LENGTH(CTREE)>0
  45.    PARSE VALUE CTREE WITH A"#"CTREE
  46.    LLEFT=LLEFT||A||"#"
  47.    IF A=DIREC THEN LEAVE;
  48.    END
  49.  
  50. /* Find a proper match */
  51. CALL DSEARCH CTREE
  52.  
  53. /* If not found start from beginning and search to the current directory*/
  54. CALL DSEARCH LLEFT
  55.  
  56. /* If it is still not found the it cannot be found */
  57. SAY "Directory Not Found"
  58. EXIT
  59.  
  60.  
  61. DSEARCH:
  62. ARG T;
  63. DO WHILE LENGTH(T)>0
  64.    PARSE VALUE T WITH A"#"T
  65.    IF POS(DEST,A)>0 & SUBSTR(A,LASTPOS('\',A)+1,LENGTH(DEST))=DEST THEN DO
  66.       '@CD 'A
  67.       EXIT
  68.    END
  69. END
  70. RETURN;
  71.  
  72.  
  73. SCANDRIVE:
  74. SAY "Scanning Drive "DRIVE
  75. IF OPTION="S" THEN '@DEL 'MFILE
  76. DMAP=""
  77. '@TREE | RXQUEUE'
  78. DO WHILE QUEUED()>0
  79.    PARSE PULL A B .
  80.    IF A\="Path:" THEN ITERATE;
  81.    DMAP=DMAP||B||"#"
  82.    CALL CHAROUT 'CON:','.'
  83. END
  84. SAY "Done"
  85. /* Write the map as a single line to reduce File I/O */
  86. CALL LINEOUT MFILE,DMAP
  87. CALL STREAM MFILE,C,'CLOSE'
  88. RETURN
  89.  
  90. GRAPHTREE:
  91. LP=1;ND=0;SAY "<ROOT of Drive "DRIVE">"
  92. DO WHILE LENGTH(DTREE)>0
  93.    PARSE VALUE DTREE WITH A"#"DTREE
  94.    LP=OCCURSIN(A,'\')
  95.    OL=COPIES('│  ',LP)||'├──'||FILESPEC("NAME",A)
  96.    SAY " "||SUBSTR(OL,2)
  97.    ND=ND+1
  98. END
  99. SAY "<Drive "DRIVE" contains "ND" Directories>"
  100. RETURN
  101.  
  102. OCCURSIN:
  103. ARG STR, CH; N=0
  104. DO WHILE LENGTH(STR)>0
  105.    P=POS(CH,STR);
  106.    IF P>0 THEN N=N+1; ELSE RETURN N;
  107.    STR=SUBSTR(STR,P+1);
  108. END;
  109. RETURN N;
  110.  
  111. HELP:
  112. SAY "Usage: QCD [destdir] [-?sg]"
  113. SAY
  114. SAY "destdir  [d:][path or partial path]"
  115. SAY
  116. SAY "options:"
  117. SAY "  -s   scan drive and create new [d:]\DISK.MAP file"
  118. SAY "  -g   display disk tree graphic"
  119. EXIT
  120.