home *** CD-ROM | disk | FTP | other *** search
/ PC-Blue - MS DOS Public Domain Library / PC-Blue MS-DOS Public Domain Library - NYACC.iso / vol309 / jdutil.arc / WC.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-07-02  |  7.4 KB  |  223 lines

  1.         TITLE WC - WORD COUNT UTILITY
  2.         PAGE 55,132
  3. ;***********************************************************************
  4. ;       THIS PROGRAM COUNTS BYTES, WORDS AND LINES IN A TEXT FILE.
  5. ;
  6. ;       USAGE:  WC filename
  7. ;               defaults to standard input if no file name given.
  8. ;
  9. ;       REQUIRES MSDOS 2 OR HIGHER
  10. ;
  11. ;       BY: JON DART
  12. ;           DEPARTMENT OF ANTHROPOLOGY
  13. ;           UCSD C-001
  14. ;        LA JOLLA, CA  92093
  15. ;
  16. ;    VERSION 1.2, 06-JUL-86
  17. ;       VERSION 1.1, 16-JAN-86
  18. ;       VERSION 1.0, 08-NOV-85
  19. ;
  20. ;****** TO BUILD WC.EXE, ASSEMBLE THIS FILE AND LINK WITH ASM.LIB ******
  21.  
  22. BUFSIZE EQU     8192                    ;SIZE OF FILE BUFFER
  23. M       EQU     BYTE PTR 0[BX]
  24.  
  25.         .XLIST
  26.         INCLUDE ASCII.DEF
  27.         INCLUDE MSDOS2.DEF
  28.     INCLUDE MACROS.DEF
  29.         .LIST
  30.  
  31.         EXTRN   COUT:NEAR,ERRORMSG:NEAR
  32.         EXTRN   TYPTX:NEAR,SKIPSP:NEAR,CPYCNT:NEAR
  33.         EXTRN   PRINTDD:NEAR
  34.  
  35. STACK   SEGMENT PARA STACK
  36.         DB 512 DUP (?)
  37. STACK   ENDS
  38.         ASSUME  SS:STACK
  39.  
  40. ;       MEMORY DEFINITIONS:
  41. ;
  42. DATA    SEGMENT BYTE PUBLIC
  43. NUMEND  DB      2 DUP (?)               ;END OF NUMBER
  44. INHANDLE DW    0                       ;INPUT FILE HANDLE
  45.                                         ;(DEFAULTS TO STD. INPUT)
  46. NUMLINE DQ      0             ;NUMBER OF LINES
  47. NUMWORD DQ      0                       ;NUMBER OF WORDS
  48. NUMBYTE DQ      0                       ;NUMBER OF BYTES
  49. PREV    DB      0                       ;PREVIOUS CHAR., USED IN WORD COUNT
  50. MSG1    DB      CR,LF,"Can't open: "
  51. FILNAM  DB      80 DUP (0)              ;STORAGE FOR FILE NAME
  52. MSG1E   DB      CR,LF,0
  53. MSG2    DB      CR,LF,"Read error.",CR,LF,0
  54. MSG3    DB      CR,LF,"Not enough memory for buffer.",CR,LF,0
  55. DATA    ENDS
  56.         ASSUME  DS:DATA,ES:DATA
  57.  
  58. BUFFER  EQU     0                       ;OFFSET TO BUFFER (FROM ES)
  59.  
  60. CODE    SEGMENT BYTE PUBLIC
  61.     ASSUME CS:CODE
  62. ENTRY:
  63.         TEST_DOS2                       ;TEST FOR DOS 2.0, EXIT IF DOS 1
  64.         MOV     BX,(BUFSIZE+800H) SHR 4
  65.     MOV    AH,SET_BLOCK
  66.     INT    DOS            ;SET PROGRAM+BUFFER SIZE
  67.     JNB    MEMOK            ;IF OK
  68.         MOV     AX,DATA
  69.         MOV     DS,AX
  70.         MOV     DX,OFFSET MSG3
  71.         CALL    ERRORMSG                ;NOT ENOUGH MEMORY
  72.         JMP     EXIT2
  73. MEMOK:  MOV     AX,DS            ;GET DATA SEG
  74.     ADD    AX,800H            ;ADD OFFSET TO BUFFER
  75.     MOV    ES,AX            ;SET EXTRA SEG TO POINT TO BUFFER
  76.         MOV     BX,OFFSET (80H)         ;GET BYTE COUNT FOR COMMAND LINE
  77.         CMP     BYTE PTR [BX],0
  78.         JNE     L_1                     ;IF NOT 0
  79.         MOV     AX,DATA
  80.         MOV     DS,AX
  81.         JMP     FILLBUF                 ;NO COMMAND LINE INPUT, USE STD. INPUT
  82. L_1:
  83.         PUSH    BX
  84.         MOV     DL,M
  85.         MOV     DH,0
  86.         ADD     BX,DX
  87.         INC     BX
  88.         MOV     M,0                     ;PUT 0 BYTE AT END OF COMMAND LINE
  89.         POP     BX
  90.         INC     BX
  91.         CALL    SKIPSP                  ;SKIP LEADING SPACES
  92.         JNC     L_2                     ;IF SOMETHING ON LINE
  93.         JMP     FILLBUF
  94. L_2:
  95.         PUSH    ES
  96.         MOV     AX,DATA
  97.         MOV     ES,AX                   ;MAKE ES POINT TO DATA SEG
  98.         MOV     SI,BX
  99.         MOV     DI,OFFSET FILNAM
  100.         MOV     CX,80
  101.         CALL    CPYCNT                  ;SAVE FILE NAME
  102.         POP     ES
  103.         MOV     AX,DATA
  104.         MOV     DS,AX                   ;DONE W. LO MEMORY, SO
  105.                                         ; POINT TO DATA SEG NOW
  106.         MOV     DX,OFFSET FILNAM        ;DX POINTS TO FILE NAME
  107.         MOV     AL,READ_ACCESS
  108.         MOV     AH,DOS2_OPEN
  109.         INT     DOS                     ;TRY TO OPEN FILE
  110.         JNC     NAMEOK                  ;IF OK
  111.         JMP     SHORT BADOPN
  112. NAMEOK:
  113.         MOV     WORD PTR INHANDLE,AX    ;SAVE FILE HANDLE
  114.         JMP     SHORT FILLBUF
  115. BADOPN:
  116.         MOV     DX,OFFSET MSG1
  117.         CALL    ERRORMSG                ;BAD OPEN, SHOW MSG.
  118.         MOV     DX,OFFSET MSG1E
  119.         CALL    ERRORMSG                ;ADD CR + LF
  120.         JMP     CLOSEFILE               ;EXIT
  121.  
  122. FILLBUF:
  123.         MOV     CX,BUFSIZE              ;CX = # BYTES TO READ
  124.         MOV     BX,WORD PTR INHANDLE    ;BX = FILE HANDLE
  125.         PUSH    DS
  126.         MOV     AX,ES
  127.         MOV     DS,AX                   ;SET DATA SEG TO WHERE BUFFER IS
  128.         MOV     DX,OFFSET BUFFER
  129.         MOV     AH,READ
  130.         INT     DOS                     ;FILL BUFFER FROM FILE
  131.         POP     DS                      ;RESTORE DATA SEG
  132.         JC      BADREAD                 ;IF ERROR
  133.         MOV     BX,OFFSET BUFFER
  134.         CMP     AX,0
  135.         JNE     GOTTEXT                 ;IF SOMETHING READ
  136.         JMP     DONE
  137.  
  138. BADREAD:
  139.         MOV     DX,OFFSET MSG2
  140.         CALL    ERRORMSG
  141.         JMP     CLOSEFILE
  142.  
  143. GOTTEXT:
  144.         ADD     AX,BX                   ;COMPUTE ADDRESS OF END OF BUFFER
  145.         MOV     DX,AX                   ;SAVE IN DX
  146.         MOV     DI,OFFSET NUMLINE       ;NUMBER OF LINES
  147.         MOV     SI,OFFSET NUMBYTE
  148. BEGIN:
  149. COUNT:  CMP     DX,BX                   ;COUNT BYTES AND LINES
  150.         JNE     L_12                    ;UNTIL END OF BUFFER
  151.         JMP     FILLBUF                 ;GO FILL BUFFER AGAIN
  152. L_12:
  153.         MOV     AL,BYTE PTR ES:[BX]     ;GET BYTE FROM BUFFER
  154.         AND     AL,7FH                  ;STRIP HI BIT
  155.         INC     BX
  156.         INC     WORD PTR [SI]           ;COUNT A BYTE
  157.         JNC     NOCARRY
  158.         INC     WORD PTR [SI+2]         ;IF CARRY
  159. NOCARRY:
  160.         CMP     AL,SPACE                ;IS SPACE?
  161.         JE      WCOUNT                  ;YES, POSSIBLE END OF WORD
  162.         CMP     AL,CR                   ;IS CR?
  163.         JNE     COUNT2                  ;NO, IGNORE CHAR.
  164. COUNTLINE:
  165.         INC     WORD PTR DS:[DI]        ;COUNT A LINE
  166.         JNC     WCOUNT
  167.         INC     WORD PTR DS:[DI+2]
  168. WCOUNT: CMP     BYTE PTR PREV,0         ;SAW A SPACE OR CR, WAS PREV. CHAR. NULL?
  169.         JE      COUNT2
  170.         CMP     BYTE PTR PREV,CR        ;OR CR?
  171.         JE      COUNT2
  172.         CMP     BYTE PTR PREV,LF        ;OR LF?
  173.         JE      COUNT2
  174.         CMP     BYTE PTR PREV,SPACE     ;OR SPACE?
  175.         JE      COUNT2
  176.         CMP     BYTE PTR PREV,TAB       ;OR TAB?
  177.         JE      COUNT2
  178.         INC     WORD PTR NUMWORD        ;NO, ASSUME END OF WORD
  179.         JNC     COUNT2
  180.         INC     WORD PTR NUMWORD+2
  181. COUNT2:
  182.         MOV     BYTE PTR PREV,AL
  183.         JMP     COUNT
  184. DONE:
  185.         MOV     AX,WORD PTR NUMBYTE
  186.         MOV     SI,AX
  187.         MOV     AX,WORD PTR NUMBYTE+2
  188.         MOV     DI,AX
  189.         MOV     AL,0
  190.         CALL    PRINTDD
  191.         CALL    TYPTX
  192.         DB      ' bytes,',SPACE+200Q
  193.         MOV     AX,WORD PTR NUMWORD
  194.         MOV     SI,AX
  195.         MOV     AX,WORD PTR NUMWORD+2
  196.         MOV     DI,AX
  197.         MOV     AL,0
  198.         CALL    PRINTDD
  199.         CALL    TYPTX
  200.         DB      ' words,',SPACE+200Q
  201.         MOV     AX,WORD PTR NUMLINE
  202.         MOV     SI,AX
  203.         MOV     AX,WORD PTR NUMLINE+2
  204.         MOV     DI,AX
  205.         MOV     AL,0
  206.         CALL    PRINTDD
  207.         CALL    TYPTX
  208.         DB      ' lines.',CR,LF+200Q
  209.         JMP     SHORT CLOSEFILE
  210.  
  211. CLOSEFILE:
  212.         MOV     BX,WORD PTR INHANDLE
  213.         CMP     BX,0                    ;WERE WE READING STD. INPUT?
  214.         JE      EXIT2                   ;YES, NO NEED TO CLOSE
  215.         MOV     AH,DOS2_CLOSE
  216.         INT     DOS                     ;CLOSE FILE
  217. EXIT2:
  218.         MOV     AH,EXIT
  219.         INT     DOS                     ;EXIT TO DOS
  220.  
  221. CODE    ENDS
  222.         END     ENTRY
  223.