home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / QBAS / GETFILES.ZIP / GETFILES.BAS next >
BASIC Source File  |  1988-10-07  |  20KB  |  597 lines

  1. '************************** Getfiles.Bas  ********************************
  2. 'These routines included have been constructed from source code that I have
  3. 'found in the public domain on a few BBS's and my own code. It was written
  4. 'using the Microsoft QuickBasic Compiler 2.0.
  5. 'I used the /L switch when loading the QuickBasic compiler and used the
  6. 'library named USERLIB.EXE which included the definittions for the INT86
  7. 'assembler routines that comes with the compiler. I have included that library
  8. 'under the named MYLIB.EXE within the archive file that has this source code.
  9. 'The assembly language routines were extracted from a file named BASTODOS.ARC
  10. 'written by James P. Morgan of Orlando, Florida. The sort routine was from an
  11. 'anonymous author under the filename QUIKSORT.ARC.
  12. 'These were my first attempts at writing with the QUICKBASIC 2.0 compiler
  13. 'I hope that maybe one of these routines will help someone out. It's been a
  14. 'great help for me to have access to some good code for nothing, and to have
  15. 'learned from it. I wish the same for you.
  16.  
  17. '                                       Michael Graves
  18. '                                       Brooklyn, NY
  19. '                                       Work: (212) 921-7514
  20. '                                       Compuserve [72507,1203]
  21.  
  22. '************************ INITIALIZE PUBLIC VARIABLES ************************
  23. '
  24. DIM GETFILES.SUBRT%(43) ' DIMENSION GETFILES ROUTINE
  25. DIM DTA%(43)            ' DIMENSION DISK TRANSFER AREA (THAT HOLDS FILE NAME, DATE ECT.)
  26. DIM FILE.NAME$(500)    ' DIMENSION FILE NAME ARRAY
  27. DIM FILE.ATTR%(500)
  28. DIM SUB.DIRECT.NAME$(512)
  29. DIM CURR.DIR.SUBRT%(40)
  30.  
  31. '**************   FOR INTERRUPT SERVICE ROUTINES  ******************
  32. DIM INPUT.INTRPT.ARRAY%(9), OUTPUT.INTRPT.ARRAY%(9)
  33. COMMON SHARED INPUT.INTRPT.ARRAY%(), OUTPUT.INTRPT.ARRAY%()
  34.  
  35. COMMON SHARED DTA%(), GETFILES.SUBRT%(), GETFILES.SUBRT.OFFSET%, FILE.NAME$()
  36. COMMON SHARED GET.FIRST%, GET.NEXT%, PATH$, ASCIIZ.STRING$, ATTRIBUTE%
  37. COMMON SHARED GET.FILES.LOADED%, RETURN.CODE%, FILE.CTR%, FILE.ATTR%()
  38. COMMON SHARED SEARCH.DRIVE$, FILE.MASK$, VOLUME.LABEL$, OLD.VOLUME.LABEL$
  39. COMMON SHARED SUB.DIRECT.NAME$(), SUB.DIR.CTR%, DOS.VERSION$
  40. COMMON SHARED ROW%, COLUMN%, CURRENT.DRIVE$, CURR.DIR.OFFSET%, CURR.DIR.SUBRT%()
  41. COMMON SHARED CURRENT.DIRECTORY$, TEMP.PATH$
  42. COMMON SHARED NEW.DRIVE.NAME$, DRIVE.NAME$
  43.  
  44. ' REGISTER DEFINITIONS FOR INTERRUPT SERVICE ROUTINES
  45. AXREG% = 0
  46. BXREG% = 1
  47. CXREG% = 2
  48. DXREG% = 3
  49. BPREG% = 4
  50. SIREG% = 5
  51. DIREG% = 6
  52. FLREG% = 7
  53. DSREG% = 8
  54. ESREG% = 9
  55.  
  56.  
  57. '**********************************************************************
  58. '*********************       MAIN PROGRAM       ***********************
  59. '**********************************************************************
  60.  
  61.   CLS
  62.   CALL INIT.ASM.ROUTINES
  63.   CALL GET.DOS.VERSION
  64.   CALL GET.CURRENT.DRIVE
  65.   CALL GET.CURRENT.DIRECTORY
  66.   CALL GET.FILESPEC
  67.   CALL GET.FILES
  68.   CALL QUICKSORT
  69.   CALL DISPLAY.FILES
  70.  
  71. END
  72. '**********************************************************************
  73. '**************            END OF MAIN PROGRAM           **************
  74. '**********************************************************************
  75.  
  76.  
  77. '**************************************************************************
  78. '*********************** SUBROUTINE - GET DOS VERSION  ********************
  79. '**************************************************************************
  80. SUB GET.DOS.VERSION STATIC
  81.  
  82. SHARED DOS.VERSION$
  83.  DEF SEG
  84.  DIM GET.DOS.VERSION.SUBRT%(40)
  85.  GET.DOS.VERSION.SUBRT.OFFSET%=0
  86.  
  87.  RESTORE GET.DOS.VERSION.DATA
  88.  FOR I% = 0 TO 27
  89.  READ J
  90.  POKE (VARPTR(GET.DOS.VERSION.SUBRT%(0))+I%),J
  91.  NEXT
  92.  
  93.  MAJOR.VERSION%=0
  94.  MINOR.VERSION%=0
  95.  RETURN.CODE%=0
  96.  GET.DOS.VERSION.SUBRT.OFFSET%=VARPTR(GET.DOS.VERSION.SUBRT%(0))
  97.  CALL ABSOLUTE (MAJOR.VERSION%,MINOR.VERSION%,RETURN.CODE%,GET.DOS.VERSION.SUBRT.OFFSET%)
  98.  IF MAJOR.VERSION% = 0 THEN
  99.    PRINT
  100.    PRINT "DOS 2.0 OR HIGHER IS REQUIRED FOR THIS PROGRAM !!!"
  101.    PRINT "PROGRAM HALTED!!!!!! "
  102.    PRINT
  103.    STOP
  104.  END IF
  105.  DOS.VERSION$ = STR$(MAJOR.VERSION%)+"."+STR$(MINOR.VERSION%)
  106.  
  107. GET.DOS.VERSION.DATA:
  108.  DATA &H55
  109.  DATA &H89,&HE5
  110.  DATA &HB4,&H30
  111.  DATA &HCD,&H21
  112.  DATA &H8B,&H76,&H0A
  113.  DATA &H88,&H04
  114.  DATA &H8B,&H76,&H08
  115.  DATA &H88,&H24
  116.  DATA &H8B,&H76,&H06
  117.  DATA &H31,&HDB
  118.  DATA &H89,&H1C
  119.  DATA &H5D
  120.  DATA &HCA,&H06,&H00
  121. END SUB
  122. '**********************************************************************
  123. '**********        END OF SUBROUTINE GET DOS VERSION        ***********
  124. '**********************************************************************
  125.  
  126. DEF FNUPCASE$(STR.TO.CONVERT$)
  127.   LENGTH = LEN(STR.TO.CONVERT$)
  128.   IF LENGTH = 0 THEN FNUPCASE$ = "" : EXIT DEF
  129.   FOR I = 1 TO LENGTH
  130.     CH = ASC(MID$(STR.TO.CONVERT$,I,1))
  131.     IF CH > 96 AND CH < 127 THEN
  132.       MID$(STR.TO.CONVERT$,I,1) = CHR$(CH-32)
  133.     END IF
  134.   NEXT
  135.   FNUPCASE$ = STR.TO.CONVERT$
  136. END DEF
  137.  
  138. SUB GET.CURRENT.DRIVE STATIC
  139. SHARED INPUT.INTRPT.ARRAY%(), OUTPUT.INTRPT.ARRAY%(), DRIVE.NAME$
  140.   INPUT.INTRPT.ARRAY%(AXREG%) = &H1900
  141.   CALL INT86(&H21, VARPTR(INPUT.INTRPT.ARRAY%(0)),VARPTR(OUTPUT.INTRPT.ARRAY%(0)))
  142.   DRIVE.NAME$ = CHR$(65+(OUTPUT.INTRPT.ARRAY%(AXREG%) AND &HFF))+":"
  143. END SUB
  144.  
  145. '**********************************************************************
  146. '**************     SUBROUTINE - GET.CURRENT.DIRECTORY      ***********
  147. '**********************************************************************
  148. SUB GET.CURRENT.DIRECTORY STATIC
  149. SHARED CURRENT.DRIVE$
  150. '**********************************************************************
  151. '* CALL FORMAT         :
  152. '* ---------------------
  153. '* CALL OFFSET%(DRIVE%,ASCIIZ.STRING$,RETURN.CODE%)
  154. '* PARAMETERS PASSED   : DRIVE%                (0=DEFAULT,1=A,2=B..ECT)
  155. '*                       ASCIIZ.STRING$        (AT LEAST A 64 BYTE
  156. '*                                             CHARACTER STRING RETURN
  157. '*                                             AREA)
  158. '*                       RETURN.CODE%=0
  159. '* PARAMETERS RETURNED : DRIVE%
  160. '*                       ASCIIZ.STRING$        (CURRENT DIRECTORY)
  161. '*                       RETURN.CODE%          (SEE ERROR CODE LIST)
  162. '* COMMENTS           :
  163. '*                     THIS SUBROUTINE WILL RETURN THE CURRENT DIRECTORY
  164. '*                    FOR THE SPECIFIED DRIVE. THE FULL PATH NAME ,
  165. '*                    STARTING WITH THE ROOT DIRECTORY IS RETURNED.
  166. '*                     THE DRIVE LETTER WILL NOT BE PART OF THE RETURNED
  167. '*                    STRING. THE STRING WILL NOT BEGIN WITH THE "\" AND
  168. '*                    WILL BE TERMINATED WITH A BYTE CONTAINING A HEX 00.
  169. '*
  170. '*************************************************************************
  171.  
  172.   DRIVE%=0
  173.   ASCIIZ.STRING$=STRING$(64,0)
  174.   CURRENT.DIRECTORY$=""
  175.   RETURN.CODE%=0
  176.  
  177.   CALL ABSOLUTE (DRIVE%,ASCIIZ.STRING$,RETURN.CODE%,CURR.DIR.OFFSET%)
  178.   IF RETURN.CODE%<>0 THEN CURRENT.DIRECTORY$="INVALID DRIVE SPECIFIED":EXIT SUB
  179.   INSTR.LOC=INSTR(ASCIIZ.STRING$,CHR$(0))
  180.   IF INSTR.LOC<2 THEN CURRENT.DIRECTORY$="\":EXIT SUB
  181.   CURRENT.DIRECTORY$="\"+LEFT$(ASCIIZ.STRING$,INSTR.LOC-1)
  182.  
  183.   'Remove comments below for testing
  184.   'PRINT "DRIVE REQUESTED   = ";DRIVE%
  185.   'PRINT "CURRENT DIRECTORY = ";CURRENT.DIRECTORY$
  186.   'PRINT "RETURN CODE       = ";RETURN.CODE%
  187.   'INPUT A$
  188.  
  189. END SUB
  190.  
  191.  
  192. SUB CHANGE.DRIVE.TO(NEW.DRIVE.NAME$) STATIC
  193. SHARED INPUT.INTRPT.ARRAY%(), OUTPUT.INTRPT.ARRAY%()
  194.   IF NEW.DRIVE.NAME$="" THEN
  195.     GOTO ERROR.EXIT.ROUTINE
  196.   END IF
  197.  NEW.DRIVE.NAME$ = MID$(NEW.DRIVE.NAME$,1,1)
  198.   IF INSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZ",NEW.DRIVE.NAME$) = 0 THEN
  199.     GOTO ERROR.EXIT.ROUTINE
  200.   END IF
  201.   INPUT.INTRPT.ARRAY%(AXREG%) = &H0E
  202.   INPUT.INTRPT.ARRAY%(DXREG%) = &H00 'ASC(NEW.DRIVE.NAME$)-ASC("A")
  203.   CALL INT86(&H21,VARPTR(INPUT.INTRPT.ARRAY%(0)),VARPTR(OUTPUT.INTRPT.ARRAY%(0)))
  204.   IF (OUTPUT.INTRPT.ARRAY%(DXREG%) < 0) THEN
  205.     GOTO ERROR.EXIT.ROUTINE
  206.   END IF
  207.   GOTO NORMAL.EXIT
  208. ERROR.EXIT.ROUTINE:
  209.   PRINT "ERROR -- INVALID DISK DRIVE, '";NEW.DRIVE.NAME$;"'"
  210.   EXIT SUB
  211. NORMAL.EXIT:
  212.   DRIVE.NAME$ = NEW.DRIVE.NAME$+":"
  213. END SUB
  214.  
  215.  
  216. '**********************************************************************
  217. '**************     SUBROUTINE - INIT.ASM.ROUTINES          ***********
  218. '*                                                                    *
  219. '* This subroutine loads into memory the assembly language code that  *
  220. '* is executed by a call statement more than once, thus avoiding the  *
  221. '* repitition of the read statement.                                  *
  222. '**********************************************************************
  223.  
  224. SUB INIT.ASM.ROUTINES STATIC
  225.  
  226. '***** VARIABLES FOR GET FIRST GET NEXT ROUTINES *****
  227. SHARED DTA%(), GETFILES.SUBRT%(), GETFILES.SUBRT.OFFSET%
  228. SHARED GET.FIRST%, GET.NEXT%, FILE.NAME$(), CURRENT.DRIVE$
  229. SHARED CURR.DIR.OFFSET%, CURR.DIR.SUBRT%()
  230.  
  231. '******* FIRST INITIALIZE THE GET FILES.NAMES ARRAY ***********
  232.  
  233.   FOR X% = 1 TO 500
  234.     FILE.NAME$(X%) = SPACE$(29)
  235.   NEXT X%
  236.  
  237.  
  238. '******** INITIALIZE SUBROUTINE OFFSET ************
  239.   GETFILES.SUBRT.OFFSET%=0
  240.   GET.FIRST%=&H4E
  241.   GET.NEXT%=&H4F
  242.  
  243.  
  244. ' INITIALIZE ASSEMBLY LANGUAGE ROUTINE
  245.   FOR I=0 TO 43
  246.     DTA%(I)=0
  247.   NEXT
  248.  
  249. ' READ ASSEMBLY EXECUTABLE CODE INTO VARIABLE GETFILES.SUBRT%
  250.   RESTORE GETFILES.DATA
  251.   FOR I=0 TO 65
  252.     READ J
  253.     POKE (VARPTR(GETFILES.SUBRT%(0))+I),J
  254.   NEXT
  255.  
  256. ' SET OFFSET TO MACHINE LANGUAGE ROUTINE
  257.   GETFILES.SUBRT.OFFSET%=VARPTR(GETFILES.SUBRT%(0))
  258.  
  259.  
  260.   GETFILES.DATA:
  261.     DATA &H55
  262.     DATA &H89,&HE5
  263.     DATA &H31,&HC0
  264.     DATA &H31,&HC9
  265.     DATA &H31,&HD2
  266.     DATA &H8B,&H76,&H0E
  267.     DATA &H8A,&H24
  268.     DATA &H8B,&H76,&H0C
  269.     DATA &H8B,&H0C
  270.     DATA &H8B,&H76,&H0A
  271.     DATA &H8B,&H54,&H02
  272.     DATA &HCD,&H21
  273.     DATA &H8B,&H76,&H06
  274.     DATA &H88,&H04
  275.     DATA &H8B,&H76,&H08
  276.     DATA &H89,&HF7
  277.     DATA &H06
  278.     DATA &H31,&HDB
  279.     DATA &HB4,&H2F
  280.     DATA &HCD,&H21
  281.     DATA &HFC
  282.     DATA &HB9,&H2C,&H00
  283.     DATA &H89,&HDE
  284.     DATA &H90,&H90,&H90
  285.     DATA &H1E
  286.     DATA &H06
  287.     DATA &H1F
  288.     DATA &H07
  289.     DATA &HF3
  290.     DATA &HA4
  291.     DATA &H06
  292.     DATA &H1F
  293.     DATA &H07
  294.     DATA &H5D
  295.     DATA &HCA,&H0A,&H00
  296. END.GETFILES.LOAD:
  297.  
  298.  
  299. ' ** LOAD GET CURRENT DIRECTORY LETTER ROUTINE TO MEMORY
  300.  
  301.   CURR.DIR.OFFSET%=0
  302.   RESTORE GET.CURR.DIR.DATA
  303.   FOR I=0 TO 28
  304.   READ J
  305.   POKE (VARPTR(CURR.DIR.SUBRT%(0))+I),J
  306.   NEXT
  307.  
  308.   CURR.DIR.OFFSET%=VARPTR(CURR.DIR.SUBRT%(0))
  309.  
  310. GET.CURR.DIR.DATA:
  311.     DATA &H55
  312.     DATA &H89,&HE5
  313.     DATA &H8B,&H76,&H0A
  314.     DATA &H8A,&H14
  315.     DATA &H8B,&H5E,&H08
  316.     DATA &H8B,&H77,&H02
  317.     DATA &H31,&HC0
  318.     DATA &HB4,&H47
  319.     DATA &HCD,&H21
  320.     DATA &H8B,&H76,&H06
  321.     DATA &H88,&H04
  322.     DATA &H5D
  323.     DATA &HCA,&H06,&H00
  324. END.GET.CURR.DIR.DATA:
  325.  
  326. END SUB
  327. '**********************************************************************
  328. '*************** END OF SUBROUTINE INIT.ASM.ROUTINE *******************
  329. '**********************************************************************
  330.  
  331.  
  332.  
  333.  
  334. '**********************************************************************
  335. '**************         SUBROUTINE - GET.FILESPEC        **************
  336. '**********************************************************************
  337. SUB GET.FILESPEC STATIC
  338.  
  339. SHARED PATH$, TEMP.PATH$
  340.  
  341. 'CHECK FOR VALID DRIVE LETTER
  342. 'DIRECTORY PATH STRING
  343. 'FILENAME AND EXTENSION
  344.  
  345.   PATH$ = "\????????.???"
  346.   INPUT "Enter DRIVE:\PATH\FILE-MASK >>>> ",PATH$
  347.   TEMP.PATH$=PATH$
  348.   IF PATH$= "" THEN
  349.     PATH$=DRIVE.NAME$+CURRENT.DIRECTORY$+"\????????.???"
  350.     EXIT SUB
  351.   END IF
  352.   IF LEN(PATH$) = 3 THEN
  353.     IF RIGHT$(PATH$,1)="\" THEN
  354.       PATH$=PATH$+"????????.???"
  355.     END IF
  356.     EXIT SUB
  357.   END IF
  358.   IF MID$(PATH$,2,1) = ":" THEN
  359.     DRIVE$ = LEFT$(PATH$,2)
  360.     IF INSTR(PATH$,"\") THEN
  361.       PATH$=MID$(PATH$,INSTR(PATH$,"\"))
  362.       PATH$ = DRIVE$ + PATH$
  363.     END IF
  364.     IF LEN(TEMP.PATH$) = 2 THEN
  365.       PATH$=PATH$+CURRENT.DIRECTORY$+"\????????.???"
  366.     END IF
  367.     IF PATH$= "\*.*" THEN
  368.       PATH$="\????????.???"
  369.     END IF
  370.     EXIT SUB
  371.   END IF
  372.   IF MID$(PATH$,2,1) = ":" THEN
  373.     IF LEN(PATH$) > 2 THEN
  374.       DRIVE$ = LEFT$(PATH$,2)
  375.       PATH$ = MID$(PATH$,3)
  376.       PATH$ = DRIVE$ + PATH$
  377.     ELSE
  378.       PATH$ = DRIVE$ + "????????.???"
  379.     END IF
  380.     EXIT SUB
  381.   END IF
  382.   IF PATH$= "\*.*" THEN
  383.     PATH$="\????????.???"
  384.   END IF
  385. END SUB
  386. '**********************************************************************
  387. '**************      END OF SUBROUTINE - GET.FILESPEC    **************
  388. '**********************************************************************
  389.  
  390.  
  391.  
  392. '**********************************************************************
  393. '******************    SUBROUTINE - GET FILES   ***********************
  394. '**********************************************************************
  395. SUB GET.FILES STATIC
  396.  
  397. SHARED DTA%(), GETFILES.SUBRT%(), GETFILES.SUBRT.OFFSET%, FILE.NAME$()
  398. SHARED GET.FIRST%, GET.NEXT%, PATH$, ASCIIZ.STRING$, ATTRIBUTE%
  399. SHARED GET.FILES.LOADED%, RETURN.CODE%, FILE.CTR%, FILE.ATTR%()
  400. SHARED SEARCH.DRIVE$, FILE.MASK$, VOLUME.LABEL$, OLD.VOLUME.LABEL$
  401. SHARED SUB.DIRECT.NAME$(), SUB.DIR.CTR%
  402.  
  403.  
  404.   'PATH$ = "\????????.???" ' USE WITHOUT COMMENT FOR TESTING
  405.  
  406.  
  407.   VOLUME.LABEL$ = "NONE"
  408.   FILE.CTR% = 0
  409.   SUB.DIR.CTR% = 0
  410.   ASCIIZ.STRING$=PATH$+CHR$(0)
  411.   ATTRIBUTE% = 249
  412.   RETURN.CODE%=0
  413.   CALL ABSOLUTE (GET.FIRST%,ATTRIBUTE%,ASCIIZ.STRING$,DTA%(0),RETURN.CODE%, GETFILES.SUBRT.OFFSET%)
  414.   IF RETURN.CODE% <> 18 THEN
  415.     CALL STORE.FILE.BY.TYPE
  416.   END IF
  417.  
  418.   IF RETURN.CODE% = 18 AND FILE.CTR% = 0 THEN
  419.     print
  420.     PRINT"No files found to match --> ";PATH$
  421.     print
  422.     EXIT SUB
  423.   END IF
  424.  
  425.   DONE% = FALSE
  426.   WHILE (DONE% = FALSE)
  427.     RETURN.CODE% = 0
  428.     ATTRIBUTE% = 255
  429.     CALL ABSOLUTE (GET.NEXT%,ATTRIBUTE%,ASCIIZ.STRING$,DTA%(0),RETURN.CODE%, GETFILES.SUBRT.OFFSET%)
  430.     IF RETURN.CODE% = 18 THEN
  431.       DONE% = TRUE
  432.       EXIT SUB
  433.     END IF
  434.     CALL STORE.FILE.BY.TYPE
  435.   WEND
  436.   GET.FILES.EXIT:
  437. END SUB
  438. '**********************************************************************
  439. '**************     END OF - SUBROUTINE - GET.FILES      **************
  440. '**********************************************************************
  441.  
  442.  
  443. '**********************************************************************
  444. '********************* SUBROUTINE - STORE.FILE.BY.TYPE ****************
  445. '**********************************************************************
  446. SUB STORE.FILE.BY.TYPE STATIC
  447.  
  448. SHARED FILE.NAME$(), FILE.CTR%, DTA%(), FILE.DATE$(), FILE.TIME$()
  449. SHARED SUB.DIRECT.NAME$(), SUB.DIR.CTR%, VOLUME.LABEL$
  450.  
  451.   IF (PEEK(VARPTR(DTA%(0))+21) AND 16) = 16 THEN
  452.     SUB.DIR.CTR% = SUB.DIR.CTR% + 1
  453.     SUB.DIRECT.NAME$(SUB.DIR.CTR%) = ""
  454.     I = 30
  455.     WHILE (PEEK(VARPTR(DTA%(0))+I) <> 0)
  456.       SUB.DIRECT.CHAR$=CHR$(PEEK(VARPTR(DTA%(0))+I))
  457.       SUB.DIRECT.NAME$(SUB.DIR.CTR%)=SUB.DIRECT.NAME$(SUB.DIR.CTR%) + SUB.DIRECT.CHAR$
  458.       I = I + 1
  459.     WEND
  460.     EXIT SUB
  461.   END IF
  462.   IF (PEEK(VARPTR(DTA%(0))+21) AND 8) = 8 THEN
  463.     VOLUME.LABEL$ = ""
  464.     I = 30
  465.     WHILE (PEEK(VARPTR(DTA%(0))+I) <> 0)
  466.       VOLUME.LABEL.CHAR$=CHR$(PEEK(VARPTR(DTA%(0))+I))
  467.       IF VOLUME.LABEL.CHAR$ <> "." THEN
  468.         VOLUME.LABEL$ = VOLUME.LABEL$ + VOLUME.LABEL.CHAR$
  469.       END IF
  470.       I = I + 1
  471.     WEND
  472.     EXIT SUB
  473.   END IF
  474.   IF ((PEEK(VARPTR(DTA%(0))+21) AND 32) = 0) OR ((PEEK(VARPTR(DTA%(0))+21) AND 32) = 32) THEN
  475.       FILE.CTR% = FILE.CTR% + 1
  476.       FILE.NAME$(FILE.CTR%) = ""
  477.       I = 30
  478.     WHILE (PEEK(VARPTR(DTA%(0))+I) <> 0)
  479.       FILE.NAME.CHAR$=CHR$(PEEK(VARPTR(DTA%(0))+I))
  480.       FILE.NAME$(FILE.CTR%)=FILE.NAME$(FILE.CTR%) + FILE.NAME.CHAR$
  481.       I = I + 1
  482.     WEND
  483.     FILE.ATTR%(FILE.CTR%) = PEEK(VARPTR(DTA%(0))+21)
  484.   END IF
  485. END SUB
  486.  
  487.  
  488. '**********************************************************************
  489. '********************* SUBROUTINE - DISPLAY.FILES *********************
  490. '**********************************************************************
  491. SUB DISPLAY.FILES STATIC
  492.  
  493. SHARED SUB.DIR.CTR%, SUB.DIRECT.NAME$, CURRENT.DIRECTORY$
  494.  
  495. IF FILE.CTR% > 0 THEN
  496.   CLS
  497.   PRINT "Volume label = ";
  498.   CALL PRINT.INVERTED(VOLUME.LABEL$)
  499.   PRINT "     ";
  500.   PRINT "Dos Version = ";
  501.   CALL PRINT.INVERTED(DOS.VERSION$)
  502.   LOCATE 2,1
  503.   PRINT "Current Drive and Path =";
  504.   CALL PRINT.INVERTED(DRIVE.NAME$)
  505.   CALL PRINT.INVERTED(CURRENT.DIRECTORY$)
  506.   PRINT
  507.   LOCATE 3,1
  508.   PRINT "Requested Path =";
  509.   CALL PRINT.INVERTED(TEMP.PATH$)
  510.   LOCATE 10,1
  511.   ROW% = 4
  512.   COLUMN% = 1
  513.   OFFSET% = 15
  514.   IF SUB.DIR.CTR% > 0 THEN
  515.     FOR X% = 1 TO SUB.DIR.CTR%
  516.       LOCATE ROW%,COLUMN%
  517.       CALL PRINT.HIGHLIGHTED(SUB.DIRECT.NAME$(X%))
  518.       CALL ADVANCE.TO.PRINT.FILENAME
  519.       PRINT
  520.     NEXT X%
  521.   END IF
  522.   FOR X%=1 TO FILE.CTR%
  523.     IF FILE.NAME$(X%) <> "" THEN
  524.       LOCATE ROW%,COLUMN%
  525.       PRINT FILE.NAME$(X%)';"  ";:LOCATE ROW%,COLUMN%+OFFSET%:PRINT FILE.ATTR%(X%)
  526.       CALL ADVANCE.TO.PRINT.FILENAME
  527.     END IF
  528.   NEXT X%
  529.   LOCATE 24,1
  530.   PRINT FILE.CTR%;"File(s)";"    ";SUB.DIR.CTR%;" Sub Directorie(s)";
  531.     ELSE
  532.       print
  533.       PRINT"No files found to match --> ";PATH$
  534.       print
  535. END IF
  536. END SUB
  537. '**********************************************************************
  538. '********************** END OF SUBROUTINE DISPLAY.FILES ***************
  539. '**********************************************************************
  540.  
  541.  
  542. SUB PRINT.INVERTED(STRING.TO.PRINT$) STATIC
  543.   COLOR 0,7
  544.   PRINT STRING.TO.PRINT$;
  545.   COLOR 2,0
  546. END SUB
  547.  
  548.  
  549.  
  550. SUB PRINT.HIGHLIGHTED(STRING.TO.PRINT$) STATIC
  551.   COLOR 15,0
  552.   PRINT STRING.TO.PRINT$;
  553.   COLOR 2,0
  554. END SUB
  555.  
  556.  
  557.  
  558. SUB ADVANCE.TO.PRINT.FILENAME STATIC
  559. SHARED ROW%, COLUMN%
  560.     IF ROW% < 23 THEN
  561.       ROW% = ROW% + 1
  562.     ELSE
  563.       ROW% = 4
  564.       IF COLUMN% < 60 THEN
  565.         COLUMN% = COLUMN% + 20
  566.       END IF
  567.     END IF
  568. END SUB
  569.  
  570.  
  571. '**********************************************************************
  572. '*********************    SUBROUTINE - QUICKSORT    *******************
  573. '**********************************************************************
  574. SUB QUICKSORT STATIC
  575.  
  576. SHARED FILE.NAME$(), FILE.CTR%
  577.  
  578. IF FILE.CTR% <= 0 THEN EXIT SUB
  579. 50380 S.AL% = FILE.CTR% ' Limit of array to be sorted **** REQUIRED FOR SORT ****
  580. 50400 DIM S.SP%(CINT(LOG(S.AL%)/.346574),2) ' If sort is to be called more than once, `DIM' the stack `S.SP%' for the largest size of the array outside the sort
  581. 50420 S.IS% = 0: S.LL% = 1: S.UL% = S.AL%: GOTO 50540
  582. 50440 SWAP FILE.NAME$(S.SL%),FILE.NAME$(S.LL%):IF S.SL% > S.UL%-2 THEN S.UL% = S.SL%-1 ELSE IF S.SL% < S.LL%+2 THEN S.LL% = S.LL%+1 ELSE S.IS% = S.IS%+1: S.SP%(S.IS%,1)=S.LL%: S.SP%(S.IS%,2) = S.SL%-1: S.LL%=S.SL%+1
  583. 50460 GOTO 50540
  584. 50480 FOR S.I1% = S.LL% + 1 TO S.UL%: FOR S.I2% = S.LL% TO S.I1%: IF FILE.NAME$(S.I1%) < FILE.NAME$(S.I2%) THEN SWAP FILE.NAME$(S.I1%),FILE.NAME$(S.I2%)
  585. 50500 NEXT S.I2%: NEXT S.I1%
  586. 50520 IF S.IS% = 0 THEN EXIT SUB ELSE S.LL% = S.SP%(S.IS%,1): S.UL%=S.SP%(S.IS%,2): S.IS% = S.IS%-1
  587. 50540 IF S.UL% - S.LL% <= 9 THEN 50480 ELSE S.LS% = S.LL%: S.US% = S.UL% + 1: SWAP FILE.NAME$(S.LL%),FILE.NAME$(INT((S.US%-S.LS%)/2)+S.LL%)
  588. 50560 IF S.US% = S.LS%+1 THEN S.SL% = S.LS%: GOTO 50440 ELSE S.LS% = S.LS% + 1: IF FILE.NAME$(S.LS%) <= FILE.NAME$(S.LL%) THEN 50600
  589. 50580 IF S.US% = S.LS% + 1 THEN S.SL% = S.LS%-1: GOTO 50440 ELSE S.US% = S.US% - 1: IF FILE.NAME$(S.US%) >= FILE.NAME$(S.LL%) THEN 50580 ELSE SWAP FILE.NAME$(S.LS%),FILE.NAME$(S.US%): GOTO 50560
  590. 50600 IF S.US% = S.LS% + 1 THEN S.SL% = S.LS%: GOTO 50440 ELSE S.US% = S.US% - 1: IF FILE.NAME$(S.US%) >= FILE.NAME$(S.LL%) THEN 50560
  591. 50620 IF S.US% = S.LS% + 1 THEN S.SL% = S.US%: GOTO 50440 ELSE S.LS% = S.LS% + 1: IF FILE.NAME$(S.LS%) <= FILE.NAME$(S.LL%) THEN 50620 ELSE SWAP FILE.NAME$(S.LS%),FILE.NAME$(S.US%): GOTO 50600
  592. 50640 '******** End of quicker sort subroutine **
  593. END SUB
  594. '**********************************************************************
  595. '*********************** END OF SUBROUTINE QUICKSORT ******************
  596. '**********************************************************************
  597.