home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / whereis.asm < prev    next >
Assembly Source File  |  1984-03-04  |  14KB  |  322 lines

  1. TITLE WHEREIS - FIND A FILE ON THE DRIVE
  2. PAGE 60,132
  3. CGROUP  GROUP   CODSEG, DATSEG
  4.         ASSUME  CS:CGROUP,DS:CGROUP
  5. DTA     STRUC
  6.         RESERVED        DB      21 DUP(?)
  7.         ATTRIBUTE       DB
  8.         TIME            DW
  9.         DATE            DW
  10.         SIZE            DD
  11.         NAMFOUND      DB      13 DUP(?)
  12. DTA     ENDS
  13.  
  14. DATSEG SEGMENT        PUBLIC
  15. STANAME       DB      '*.*',0
  16. PATNAME       DB      '\',0
  17.                 DB      80 DUP (0)      ; SPACE FOR 64 CHAR PATH NAME
  18.                                         ; AND 13 CHAR FILE NAME
  19. FILNAME       DB      13 DUP (0)      ; SAVE ROOM FOR FULL DOS NAME
  20. DISTRANSFEAREAS     LABEL   BYTE    ; THIS STARTS AT THE END OF THE WHEREIS
  21. DATSEG        ENDS
  22. PAGE
  23. ;---------------------------------------------------------------------;
  24. ;  THIS IS THE MAIN PROGRAM THAT SETS UP THE INITIAL CONDITIONS FOR   ;
  25. ; SEARCDIRECTORY WHICH, IN TURN, DOES A RECURSIVE SEARCH.           ;
  26. ;                                                                     ;
  27. ; READS: PATNAME                                            ;
  28. ; WRITES: FILNAME                                           ;
  29. ; CALLS: SEARCDIRECTORY                                     ;
  30. ;---------------------------------------------------------------------;
  31. CODSEG        SEGMENT
  32.         ORG     100H
  33. WHEREIS         PROC    NEAR
  34.         MOV     SI,82H                  ; START OF COMMAND LINE
  35.         MOV     DI,OFFSET CGROUP:FILNAME
  36. GESEARCNAME:
  37.         LODSB                           ; GET FIRST CHARACTER
  38.         CMP     AL,0DH                  ; CARRIAGE RETURN CHARACTER?
  39.         JE      DONREADINNAME       ; YES, END OF NAME
  40.         STOSB
  41.         JMP     GESEARCNAME
  42. DONREADINNAME:
  43.         XOR     AL,AL                   ; WRITE A 0 AT THE END
  44.         STOSB
  45.         MOV     DI,OFFSET CGROUP:PATNAME
  46.         XOR     AL,AL                   ; SEARCH DIRECTORY FOR THE ZERO AT THE END
  47.         CLD                             ; OF PATNAME
  48.         MOV     CX,64                   ; MAX. LENGTH OF SCAN FOR 0
  49.         REPNZ   SCASB
  50.         MOV     BX,DI
  51.         DEC     BX                      ; DS:BX POINTS TO THE END OF PATNAME
  52.         MOV     DX,0                    ; TELL SEARCH DIRECTORY THIS IS FIRST
  53.         CALL    SEARCDIRECTORY        ; NOW DO THE RECURSIVE SEARCH
  54.         INT     20H                     ; ALL DONE RETURN TO DOS
  55. WHEREIS ENDP
  56. PAGE
  57. ;----------------------------------------------------------------;
  58. ;  THIS PROCEDURE SEARCHES ALL THE FILES IN THE CURRENT DIRECTORY;
  59. ;LOOKING FOR A MATCH. IT ALSO PRINTS THE FULL NAME OF EACH MATCH ;
  60. ;                                                                ;
  61. ;       DS:BX   POINTER TO END OF CURRENT PATH NAME.             ;
  62. ;       DS:DX   OLD DISK TRANSFER AREA (DTA).                    ;
  63. ;                                                                ;
  64. {; READS:        DISK TRANSFER AREA                               ;
  65. ; WRITES: DISK TRANSFER AREA                             ;
  66. ; CALLS: BUILNAME,GEFIRSMATCH,                     ;
  67. ;               WRITMATCHENAME,GENEXMATCH                ;
  68. ;               BUILSTANAME,SEARCSUDIRECTORY             ;
  69. ;----------------------------------------------------------------;
  70. SEARCDIRECTORY        PROC    NEAR
  71.         PUSH    SI                      ; NEED TO RESTORE ON EXIT
  72.         PUSH    DX
  73.         CALL    BUILNAME              ; BUILD THE ABSOLUTE SEARCH NAME
  74.         CALL    GEFIRSMATCH         ; SEE IF THERE IS A MATCH THERE
  75.         JC      NMATCH                ; NO MATCH CHECK SUB DIRECTORIES
  76.         CALL    WRITMATCHENAME      ; WRITE NAME OF MATCH
  77. FINNEXFILE:
  78.         CALL    GENEXMATCH          ; FIND THE NEXT MATCH
  79.         JC      NMATCH                ; NO MATCH CHECK SUB DIRECTORIES
  80.         CALL    WRITMATCHENAME      ; WRITE NAME OF MATCH
  81.         JMP     FINNEXFILE          ; LOOK FOR NEXT MATCHING NAME
  82. NMATCH:
  83.         POP     DX                      ; RESTORE DTA
  84.         PUSH    DX
  85.         CALL    BUILSTANAME         ; SEARCH FOR ALL DIRECTORIES
  86.         CALL    GEFIRSMATCH         ; GET FIRST ENTRY
  87.         JC      NMORMATCHES         ; THERE ARE NO ENTRIES
  88.         MOV     SI,DX                   ; PUT ADDRESS OF DTA IN SI
  89.         TEST    [SI].ATTRIBUTE,10H      ; IS IT A DIRECTORY ?
  90.         JNZ     IDIRECTORY            ; YES, THEN SEARCH DIRECTORY
  91. FINNEXDIRECTORY:
  92.         CALL    GENEXMATCH          ; NO, THEN FIND THE NEXT MATCH
  93.         JC      NMORMATCHES         ; THERE ARE NO MORE ENTRIES
  94.         TEST    [SI].ATTRIBUTE,10H      ; IS IT A DIRECTORY ?
  95.         JZ      FINNEXDIRECTORY     ; YES, SEARCH DIRECTORY
  96. IDIRECTORY:
  97.         CMP     [SI].NAMFOUND,'.'     ; IS THIS A . OR .. DIRECTORY
  98.         JE      FINNEXDIRECTORY     ; YES THEN SKIP TO NEXT DIRECTORY
  99.         CALL    SEARCSUDIRECTORY    ; SEARCH THE SUB DIR
  100.         PUSH    AX                      ; NOW RESET THE DTA
  101.         MOV     AH,1AH
  102.         INT     21H
  103.         POP     AX
  104.         JMP     FINNEXDIRECTORY
  105. NMORMATCHES:
  106.         POP     DX
  107.         POP     SI
  108.         RET
  109. SEARCDIRECTORY        ENDP
  110. PAGE
  111. ;---------------------------------------------------------------;
  112. ; THIS PROCEDURE SEARCHES THE SUB DIR WHOSE NAME IS IN THE DTA  ;
  113. ;                                                               ;
  114. ;       DS:BX   END OF CURRENT PATHNAME                         ;
  115. ;       DS:[DX].NAMFOUND      NAME OF SUB DIR TO SEARCH ;
  116. ;                                                               ;
  117. ; READS:        PATNAME                                       ;
  118. ; WRITE:        PATNAME                                       ;
  119. ; CALLS:        SEARCDIRECTORY                                ;
  120. ;--------------------------------------------------------------;
  121. SEARCSUDIRECTORY    PROC    NEAR
  122.         PUSH    DI
  123.         PUSH    SI
  124.         PUSH    AX
  125.         PUSH    BX
  126.         CLD                             ; SET FOR INCREMENT
  127.         MOV     SI,DX                   ; PUT THE ADDRESS OF DTA IN SI
  128.         ADD     SI,OFFSET NAMFOUND    ; SET TO START OF SUB DIR NAME
  129.         MOV     DI,BX                   ; DS:DI - 0 AT END OF PATH NAME
  130. COPLOOP:
  131.         LODSB                           ; COPY ONE CHARACTER
  132.         STOSB
  133.         OR      AL,AL                   ; WAS IT A ZERO
  134.         JNZ     COPLOOP               ; NO, KEEP COPYING
  135.         MOV     BX,DI                   ; SET BX TO END OF NEW PATHNAME
  136.         STD                             ; SET FLAG FOR DECREMENT
  137.         STOSB                           ; STORE A 0 AT END OF STRING
  138.         MOV     AL,'\'
  139.         STOSB                           ; PLACE A \ AT END OF PATHNAME
  140.         CALL    SEARCDIRECTORY        ; SEARCH THIS NEW PATH
  141.         POP     BX                      ; RESTORE THE OLD END-OF-PATH
  142.         MOV     BYTE PTR [BX],0         ; AND STORE A ZERO THERE
  143.         POP     AX
  144.         POP     SI
  145.         POP     DI
  146.         RET
  147. SEARCSUDIRECTORY    ENDP
  148. PAGE
  149. ;---------------------------------------------------------------;
  150. ;  THIS PROCEDURE PRINTS THE MATCHED NAME AFTER THE PATH NAME   ;
  151. ;                                                               ;
  152. ;       DS:DX   POINTER TO CURRENT DTA                          ;
  153. ;                                                               ;
  154. ; READS:        PATNAME,NAMFOUND (IN DTA)                   ;
  155. ; CALLS: WRITSTRING,SENCRLF                         ;
  156. ;---------------------------------------------------------------;
  157. WRITMATCHENAME      PROC    NEAR
  158.         PUSH    AX
  159.         PUSH    DX
  160.         MOV     DX,OFFSET CGROUP:PATNAME
  161.         MOV     AL,[BX]                 ; SAVE CHAR AT END OF PATH
  162.         MOV     BYTE PTR [BX],0         ; SET FOR END OF STRING
  163.         CALL    WRITSTRING
  164.         MOV     [BX],AL                 ; RESTORE CHARACTER
  165.         POP     DX
  166.         PUSH    DX
  167.         ADD     DX,OFFSET NAMFOUND
  168.         CALL    WRITSTRING
  169.         CALL    SENCRLF
  170.         POP     DX
  171.         POP     AX
  172.         RET
  173. WRITMATCHENAME      ENDP
  174. PAGE
  175. ;---------------------------------------------------------------;
  176. ;  THIS PROCEDURE BUILDS AN ABSOLUTE SEARCH NAME FROM PATNAME ;
  177. ; FOLLOWED BY FILNAME                                         ;
  178. ;                                                               ;
  179. ; READS:        FILNAME                                       ;
  180. ; CALLS:        BUILD                                           ;
  181. ;---------------------------------------------------------------;
  182. BUILNAME      PROC    NEAR
  183.         PUSH    SI
  184.         MOV     SI,OFFSET CGROUP:FILNAME
  185.         CALL    BUILD
  186.         POP     SI
  187.         RET
  188. BUILNAME      ENDP
  189. BUILSTANAME PROC    NEAR
  190.         PUSH    SI
  191.         MOV     SI,OFFSET CGROUP:STANAME
  192.         CALL    BUILD
  193.         POP     SI
  194.         RET
  195. BUILSTANAME ENDP
  196. PAGE
  197. ;---------------------------------------------------------------;
  198. ;  THIS PROCEDURE APPEND THE STRING AT DS:SI TO PATNAME IN    ;
  199. ; PATNAME. IT KNOWS WHERE THE PATNAME END FROM KNOWING HOW  ;
  200. ; LONG PATNAME IS.                                            ;
  201. ;                                                               ;
  202. ;       DS:SI   NAME OF FILE                                    ;
  203. ;       DS:BX   END OF PATNAME                                ;
  204. ;                                                               ;
  205. ; READS:        DS:SI                                           ;
  206. ; WRITES:       PATNAME                                       ;
  207. ;---------------------------------------------------------------;
  208. BUILD   PROC    NEAR
  209.         PUSH    AX
  210.         PUSH    DI
  211.         MOV     DI,BX
  212.         CLD                             ; SET FOR INCREMENT
  213. COPNAME:
  214.         LODSB
  215.         STOSB                           ; COPY A CHARACTER OF NAME
  216.         OR      AL,AL                   ; END OF STRING YET?
  217.         JNZ     COPNAME               ; NO KEEP COPYING
  218.         POP     DI
  219.         POP     AX
  220.         RET
  221. BUILD   ENDP
  222. PAGE
  223. ;------------------------------------------------------------------;
  224. ;  THIS PROCEDURE FINDS THE FIRST MATCH BETWEEN THE NAME GIVEN BY  ;
  225. ; DS:DX AND THE DIRECTORY ENTRIES FOUND IN THE DIRECTORY PATNAME ;
  226. ;                                                          ;
  227. ;       DS:DX   POINTER TO CURRENT DTA                             ;
  228. ;RETURNS:                                                          ;
  229. ;       CF      0       A MATCH WAS FOUND                          ;
  230. ;               1       NO MATCH FOUND                     ;
  231. ;       AX      2      FILE NOT FOUND                             ;
  232. ;               18      NO MORE FILES                              ;
  233. ;       DS:DX           POINTER TO NEW DTA                         ;
  234. ;                                                                  ;
  235. ; READS:        PATNAME                                          ;
  236. ; WRITES:       DISTRANSFEAREAS                                ;
  237. ;------------------------------------------------------------------;
  238. GEFIRSMATCH PROC    NEAR
  239.         PUSH    CX
  240.         CMP     DX,0            ; FIRST ONE :
  241.         JA      ALLOCATE        ; NO THEN ALLOCATE SPACE
  242.         MOV     DX,OFFSET CGROUP:DISTRANSFEAREAS-TYPE DTA
  243. ALLOCATE:
  244.         ADD     DX,TYPE DTA     ; NO THEN ALLOCATE ROOM FOR NEW DTA
  245.         MOV     CX,10H          ; SEARCH ATTRIBUTE FOR FILES ANDS DIRS.
  246.         MOV     AH,1AH          ; SET DTA
  247.         INT     21H
  248.         PUSH    DX              ; NEED DX FOR ADDRESS OF SEARCH NAME
  249.         MOV     DX,OFFSET CGROUP:PATNAME
  250.         MOV     AH,4EH          ; CALL FOR FIND FIRST MATCH
  251.         INT     21H
  252.         POP     DX
  253.         POP     CX
  254.         RET
  255. GEFIRSMATCH ENDP
  256. PAGE
  257. ;---------------------------------------------------------------;
  258. ; THIS PROCEDURE IS MUCH LIKE GET FIRST MATCH.                  ;
  259. ;                                                               ;
  260. ; RETURNS                                                       ;
  261. ;       CF      0       A MATCH WAS FOUND                       ;
  262. ;               1       NO MATCH FOUND                          ;
  263. ;       AX      2       FILE NOT FOUND                          ;
  264. ;               18      NO MORE FILES                           ;
  265. ;                                                               ;
  266. ; READS:        PATNAME                                       ;
  267. ; WRITES:       DISTRANSFEAREAS                             ;
  268. ;---------------------------------------------------------------;
  269. GENEXMATCH  PROC    NEAR
  270.         PUSH    CX
  271.         PUSH    DX
  272.         MOV     DX,OFFSET CGROUP:PATNAME
  273.         MOV     CX,10H          ;ATTRIBUTE FOR FILES AND DIRECTORIES
  274.         MOV     AH,4FH          ; CALL FOR FIND NEXT MATCH
  275.         INT     21H
  276.         POP     DX
  277.         POP     CX
  278.         RET
  279. GENEXMATCH  ENDP
  280. PAGE
  281. ;---------------------------------------------------------------;
  282. ; THIS PROC SEND A CRLF TO THE SCREEN                           ;
  283. ;---------------------------------------------------------------;
  284. SENCRLF       PROC    NEAR
  285.         PUSH    AX
  286.         PUSH    DX
  287.         MOV     AH,02
  288.         MOV     DL,0AH
  289.         INT     21H
  290.         MOV     DL,0DH
  291.         INT     21H
  292.         POP     DX
  293.         POP     AX
  294.         RET
  295. SENCRLF       ENDP
  296. ;---------------------------------------------------------------;
  297. ; THIS PROC WRITES THE ASCIIZ STRING AT                         ;
  298. ; DS:DX         ADDRESS OF ASCIIZ                               ;
  299. ;---------------------------------------------------------------;
  300. WRITSTRING    PROC    NEAR
  301.         PUSH    AX
  302.         PUSH    DX
  303.         PUSH    SI
  304.         CLD                             ; SET FOR INCREMENT
  305.         MOV     SI,DX                   ; SET POINTER TO STRING
  306.         MOV     AH,2
  307.        LODSB
  308. WRITSTRINLOOP:
  309.         MOV     DL,AL
  310.         INT     21H                     ; WRITE THE CHAR
  311.         LODSB
  312.         OR      AL,AL                   ; ENOF STRING??
  313.         JNZ     WRITSTRINLOOP
  314.         POP     SI
  315.         POP     DX
  316.         POP     AX
  317.         RET
  318. WRITSTRING    ENDP
  319. ;
  320. CODSEG        ENDS
  321.         END     WHEREIS
  322.