home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol157 / fscan.a86 < prev    next >
Encoding:
Text File  |  1985-03-14  |  4.5 KB  |  178 lines

  1.     TITLE    'FILE NAME SCANNER'
  2.     PAGEWIDTH 110
  3.  
  4.     CSEG
  5.  
  6. ;PROGRAMMED BY A. L. BENDER, M. D.
  7. ;NEUROLOGICAL SERVICES, INC.
  8. ;WESTWOOD NJ 07675
  9. ;THIS MAY BE USED FREELY BY ANYONE BUT THE ABOVE "BYLINE"
  10. ;MUST REMAIN UNCHANGED
  11.  
  12.     PUBLIC    FSCAN
  13. ;
  14. ;enter with:
  15. ;    DX-->FCB ADDRESS
  16. ;    BX-->STRING TO CONVERT
  17. ;    DS:=>BOTH DX AND BX
  18. ;    CALL    FSCAN:NEAR
  19. ;
  20. ;EXIT WITH:
  21. ;    AL=0 AND Z FLAG SET MEANS NO ERROR OCCURRED DURING SCAN
  22. ;    AH IS DESTROYED.
  23. ;    DIRECTION FLAG IS CLEARED
  24. ;    BX=>LAST CHARACTER SCANNED (THE ONE THAT STOPPED THE SCAN)
  25. ;    DX=>POINTS TO YOUR FCB AS ON ENTRY
  26. ;    ALL OTHER REGISTERS EXCEPT PSW ARE PRESERVED
  27. ;    AL=NON ZERO AND ZFLAG CLEAR MEANS ERROR DURING SCAN
  28. ;
  29. ;    SCAN STOPS ON COMMA, SEMICOLON, EQUALS SIGN, BLANK, CARRIAGE
  30. ;        RETURN, LEFT BRACKET, LESS THAN SIGN, ZERO (NULL).
  31. ;    ON EXIT THE FCB IS ALL SET UP TO USE (THE BODY IS ZEROIZED
  32. ;    AND THE FILENAME, DISK AND EXTENSION ARE SET FOR USE)
  33. ;
  34. ;    YOU MAY WISH TO MAKE THIS A "FAR" PROCEDURE.  TO DO THIS YOU
  35. ;    MUST CALL IT FSCAN END EXTERNALIZE IT ":FAR".  CHANGE THE
  36. ;    RETURN FOLLOWING THE LABEL "EXIT" TO "RETF" RATHER THAN "RET"
  37. ;
  38. ;    THIS SUBROUTINE USES NO OTHER SUBROUTINES.
  39. ;
  40. ;
  41. FCBLEN    EQU    36    ;SIZE OF FILE CONTROL BLOCK
  42. FNAMEL    EQU    8    ;LENGTH OF FILENAME (PRIMARY NAME)
  43. FEXTL    EQU    3    ;LENGTH OF FILE EXTENSION
  44. FNLEN    EQU    FNAMEL+FEXTL
  45. FSPEC    EQU    FNLEN+1    ;FILE AND DISK SIZE
  46. FSCAN:    PUSH    CX
  47.     PUSH    ES
  48.     PUSH    SI
  49.     PUSH    DI
  50.     CLD
  51.     MOV    AX,DS
  52.     MOV    ES,AX
  53.     MOV    CX,(FCBLEN-FSPEC)/2    ;SOZE OF FCB TO BE ZEROED
  54.     MOV    DI,DX            ;FCB ADDRESS
  55.     ADD    DI,FSPEC        ;START OF FCB BEYOND FN
  56.     XOR    AX,AX
  57.     REP STOSW            ;ZERO FCB
  58.     MOV    DI,DX
  59.     MOV    CX,FSPEC/2
  60.     MOV    AX,'  '            ;BLANK OUT FILE NAME IN FCB
  61.     REP STOSW
  62.     MOV    SI,DX
  63.     MOV    BYTE PTR 0 [SI],0    ;ZERO DISK INDICATOR
  64.     CMP    BYTE PTR 1[BX],':'    ;LOOK FOR EXPLICIT DISK
  65.     JNE    NODISK            ;NONE
  66.     MOV    AL,BYTE PTR 0 [BX]    ;GET START OF STRING
  67.     CALL    UPPERCASE        ;TRANSLATE TO UPPER CASE
  68.     JNZ    ERROR            ;ERROR... NOT A LETTER
  69.     SUB    AL,'A'-1        ;FORM DISK ID
  70.     MOV    BYTE PTR 0 [SI],AL    ;SAVE DISK ID
  71.     INC    BX            ;PASS ':'
  72.     INC    BX            ;
  73. NODISK:    MOV    CX,FNAMEL    ;FILE NAME SIZE
  74. NOD1:    MOV    AL,BYTE PTR 0 [BX]    ;GET FIRST CHARACTER OF FILE NAME
  75.     CALL    UPPERCASE        ;TRANSLATE TO UC
  76.     JNZ    NOTLET            ;NOT A LETTER - SPECIAL
  77. NOD2:    INC    SI
  78.     INC    BX            ;MOVE POINTERS ALONG
  79.     MOV    BYTE PTR 0 [SI],AL    ;PUT CHARACTER IN FCB
  80.     LOOP    NOD1        ;LOOP THRU FILE NAME
  81. NOD3:    MOV    AL,BYTE PTR 0 [BX]    ;GET NEXT CHARACTER IN IMAGE
  82.     CMP    AL,'.'        ;MUST BE PERIOD OR TERMINATOR
  83.     JZ    FEXT        ;FILE EXTENSION
  84.     CALL    TERM        ;CHECK FOR TERMINATOR
  85.     JZ    DONE        ;TERMINATOR
  86. ERROR:    MOV    AL,1        ;IMPROPER FILE SYNTAX
  87.     JMPS    EXIT
  88. DONE:    XOR    AL,AL
  89. EXIT:    OR    AL,AL
  90.     POP    DI
  91.     POP    SI
  92.     POP    ES
  93.     POP    CX
  94.     RET            ;RETURN TO USER PROGRAM
  95.  
  96.  
  97. NOTLET:    CMP    AL,'*'        ;IS IT ASTERISK?
  98.     JZ    NOL1        ;YES
  99.     CMP    AL,'.'        ;FIND PERIOD?
  100.     JZ    FEXT        ;YERP ->PROCESS EXTENSION
  101.     CALL    TERM        ;CHECK FOR TERMINATOR CHARACTER
  102.     JZ    DONE        ;FINISHED SCAN
  103.     JMPS    NOD2
  104. NOL1:    INC    BX        ;POINT TO NEXT CHARACTER IN STRING
  105.     CALL    STAR        ;CONVERT *-->???
  106.     JMPS    NOD3        ;KILL REMAINDER OF FILENAME PROCESSING
  107.  
  108. FEXT:    MOV    CX,FEXTL    ;SET FOR MAX 3 CHARACTER EXTENSION
  109.     INC    BX        ;PASS THE '.'
  110.     MOV    SI,FNAMEL    ;BIAS FOR EXTENSION
  111.     ADD    SI,DX        ;ADD FCB START (FORM LOC OF EXTENSION)
  112. FX1:    MOV    AL,BYTE PTR 0 [BX]
  113.     CALL    UPPERCASE
  114.     JNZ    SPCH        ;SPECIAL CHARACTER
  115. FX2:    INC    BX
  116.     INC    SI
  117. FX3:    MOV    BYTE PTR 0 [SI],AL
  118.     LOOP    FX1
  119.     MOV    AL,BYTE PTR 0 [BX]
  120.     CALL    TERM
  121.     JZ    DONE        ;FINISHED WITH SCAN
  122.     JMPS    ERROR        ;SCAN ENDED IMPROPERLY
  123. SPCH:    CMP    AL,'*'
  124.     JNZ    SPCH1        ;NOT ASTERISK
  125.     CALL    STAR
  126.     INC    BX
  127.     MOV    AL,BYTE PTR 0 [BX]
  128.     CALL    TERM
  129.     JZ    DONE
  130.     JMPS    ERROR
  131. SPCH1:    CALL    TERM
  132.     JNZ    FX2        ;NOT TERMINATOR, JUST STORE IT
  133.     JMPS    DONE        ;SCAN TERMINATED
  134.  
  135. ;CHECK FOR CHARACTER WHICH WILL TERMINATE D:F.E PROCESSING
  136. TERM:    CMP    AL,','        ;CHECK FOR COMMA SEPARATOR
  137.     JZ    T1        ;NOPE
  138.     TEST    AL,AL        ;CHECK FOR NULL (END OF STRING MARK)
  139.     JZ    T1        ;NOPE
  140.     CMP    AL,' '        ;TEST BLANK
  141.     JZ    T1        ;EXIT IF BLANK
  142.     CMP    AL,0DH        ;CARRIAGE RETURN?
  143.     JZ    T1        ;NOPE FALL THRU
  144.     CMP    AL,';'        ;SEMICOLON?
  145.     JZ    T1
  146.     CMP    AL,'='        ;EQUAL SIGN?
  147.     JZ    T1
  148.     CMP    AL,'['
  149.     JZ    T1
  150.     CMP    AL,'<'
  151. T1:    RET            ;RETURN WITH FLAGS SET
  152.  
  153. ;CONVERT THE '*' TO PROPER NUMBER OF ??? IN FCB
  154.  
  155. STAR:    MOV    AL,'?'        ;CONVERT '*' TO '???..' IN FN OR FEXT
  156.     INC    SI        ;MAKE SI POINT TO STAR FIELD
  157.     MOV    DI,SI
  158.     REP STOSB        ;REPEATEDLY STORE ? IN FCB
  159.     MOV    SI,DI        ;MAKE SI POINT TO PROPER SPOT IN FCB
  160.     RET            ;CX=COUNT OF REMAINDER OF FCB FIELD
  161.  
  162. UPPERCASE:
  163.     CMP    AL,'A'
  164.     JC    LESS        ;LESS THAN CAPITAL A
  165.     CMP    AL,'Z'+1
  166.     JNC    NOTAZ        ;NOT A-Z, MAY NEED CONVERSION
  167. LETR:    XOR    AH,AH        ;SIGNAL LETTER FOUND (Z=1 ON RETURN)
  168.     RET            ;EXIT TO USER
  169. NOTAZ:    CMP    AL,'a'        ;CHECK a-z
  170.     JC    LESS        ;DONT CONVERT
  171.     CMP    AL,'z'+1
  172.     JNC    LESS        ;NOT a-z, DONT CONVERT IT
  173.     AND    AL,01011111B    ;MASK UC BIT OUT
  174.     JMPS    LETR        ;LETTER RETURN
  175. LESS:    OR    AH,1        ;INDICATE NON LETTER
  176.     RET            ;RETURN TO USER
  177.     END
  178.