home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / dpl.zip / LIST.D < prev    next >
Text File  |  1988-07-11  |  11KB  |  545 lines

  1. PROG    LIST
  2. ;
  3. ; Sample DPL program which lists text files to the screen. The file may
  4. ;    contain up to "MAX_TBL_LENGTH" pages of text. Any more pages
  5. ;    will be ignored. This program requires ANSI.SYS to be loaded in
  6. ;    order to highlight "HIT"s in text searchs.
  7. ;
  8. ; Doug's Programming Language  -- DPL, Version 2.22
  9. ; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
  10. ;
  11. FILE    CONSL,'CON'
  12. FILE    AFILE,'                                                  ',A,BUFFA
  13. ;
  14. BUFFER    BUFFA,1024
  15. ;
  16. DEFINE    M00,'(V2.22) ENTER THE FILE NAME: '
  17. DEFINE    M01,'** CANNOT OPEN THE FILE, TRY AGAIN **'
  18. DEFINE    M02,'ONE MOMENT PLEASE...'
  19. DEFINE    M03,' Again Find Goto Left Next Prev Right Quit 7-bits '
  20. DEFINE    M04,'PG='
  21. DEFINE    M05,'MXPG='
  22. ;
  23. DEFINE    M10,'ENTER A PAGE NUMBER: '
  24. DEFINE    M11,'FIND>'
  25. ;
  26. DEFINE    AA,'A'
  27. DEFINE    FF,'F'
  28. DEFINE    GG,'G'
  29. DEFINE    LL,'L'
  30. DEFINE    NN,'N'
  31. DEFINE    PP,'P'
  32. DEFINE    RR,'R'
  33. DEFINE    QQ,'Q'
  34. DEFINE    X7,<37H AND 05FH>    ; ASCII 7 AS MODIFIED FOR COMPARISON
  35. ;
  36. DEFINE    BLANKS,'                                                                               '
  37. DEFINE    BRIGHT,<1BH,'[31;40m'>    ; ANSI.SYS RED FORGROUND, BLACK BACKGROUND 
  38. DEFINE    DIM,<1BH,'[0m'>        ; ANSI.SYS NORMAL ATTRIBUTES
  39. ;
  40. STRING    STR,132
  41. STRING    MATCH_STR,132
  42. STRING    PADDED,256
  43. ;
  44. SET    EOF,1
  45. SET    @SUBSCRIPT,0
  46. SET    @WORKN1,0
  47. SET    @WORKN2,0
  48. SET    LEFT_MARGIN,0
  49. SET    BIT_7_FLAG,0
  50. SET    FIND_LINE,0
  51. SET    FOUND_STATE,0
  52. ;
  53. ; Create an array structure. The routines TBLGET & TBLPUT will
  54. ; maintain the table. Integer INDX will be the subscript
  55. ;
  56. MAX_TBL_LENGTH    EQU    1024
  57. ;
  58. PNTR    DD    00
  59.     DD    MAX_TBL_LENGTH dup(0)
  60. SET    INDX,0
  61. SET    MAX_PAGES,MAX_TBL_LENGTH
  62. ;
  63. FIND_PNTR    DD    00
  64. ;
  65. BEGIN    LIST
  66.     EXTRN    FMOVE:NEAR, FSTRNG:NEAR
  67.     EXTRN    CLRSCR:NEAR, CMDLN:NEAR
  68.     EXTRN    _STRLEN:NEAR
  69. ;
  70.     CALL    CMDLN STR        ; GET THE FILE NAME FROM THE CMD LINE
  71.     OPEN    IO,CONSL
  72. ;
  73. A00:
  74.     CALL    GET_FILE
  75.     IF WORD STATUS EQ EOF GOTO Z00
  76.     CALL    LOAD_FILE
  77. ;
  78.     INDX    = ZERO
  79.     CALL    TBLGET
  80. ;
  81. B00:
  82.     CALL    DISPLAY_PAGE        ; DISPLAY THE CURRENT PAGE
  83.     CALL    PROMPT_OPERATOR        ; DISPLAY THE PROMPT...
  84.     IF STRING STR NE NN GOTO B10
  85.         CALL    ADVANCE_PAGE
  86.     GOTO    B00
  87. ;
  88. B10:
  89.     IF STRING STR NE PP GOTO B20
  90.     CALL    BACKUP_PAGE
  91.     GOTO    B00
  92. ;
  93. B20:
  94.     IF STRING STR NE GG GOTO B30
  95.     CALL    GOTO_PAGE
  96.     GOTO    B00
  97. ;
  98. B30:
  99.     IF STRING STR NE LL GOTO B40
  100.     CALL    MOVE_LEFT
  101.     GOTO    B00
  102. ;
  103. B40:
  104.     IF STRING STR NE RR GOTO B50
  105.     CALL    MOVE_RIGHT
  106.     GOTO    B00
  107. ;
  108. B50:
  109.     IF STRING STR NE GG GOTO B60
  110.     CALL    GOTO_PAGE
  111.     GOTO    B00
  112. ;
  113. B60:
  114.     IF STRING STR NE FF GOTO B70
  115.     CALL    FIND_TEXT
  116.     GOTO    B00
  117. ;
  118. B70:
  119.     IF STRING STR NE AA GOTO B80
  120.     CALL    CONTINUE_SEARCH
  121.     GOTO    B00
  122. ;
  123. B80:
  124.     IF STRING STR NE X7 GOTO B90
  125.     XOR    BYTE PTR [BIT_7_FLAG],0FFH    ; TOGGLE THE FLAG
  126.     GOTO    B00
  127. ;
  128. B90:
  129.     IF STRING STR NE QQ GOTO B00
  130. ;
  131. Z00:
  132.     CALL    CLRSCR
  133.     STOP
  134. ;
  135. ;
  136. ;=====================
  137. ;   ROUTINE SECTION
  138. ;    LEVEL 1
  139. ;=====================
  140. ;
  141. ;
  142. ;--------------------------------------------
  143. ; ADVANCE_PAGE -- INCREMENT THE PAGE COUNTER
  144. ;          TO DISPLAY THE NEXT PAGE
  145. ;
  146. ADVANCE_PAGE    PROC    NEAR
  147.     IF WORD INDX GE MAX_PAGES GOTO ADVPG_05
  148.     INDX    = INDX + 1
  149.     CALL    TBLGET
  150.     RETURN
  151. ;
  152. ADVPG_05:
  153.     WRITE    CONSL,BEEP
  154.     POINT    AFILE,PNTR
  155.     RETURN
  156.  
  157. ADVANCE_PAGE    ENDP
  158. ;
  159. ;
  160. ;--------------------------------------------
  161. ; BACKUP_PAGE -- DECREMENT THE PAGE COUNTER
  162. ;         TO DISPLAY THE PREVIOUS PAGE
  163. ;
  164. BACKUP_PAGE    PROC    NEAR
  165.     IF WORD INDX LE ZERO GOTO BKPG_05
  166.     INDX    = INDX - 1
  167.     CALL    TBLGET
  168.     RETURN
  169. ;
  170. BKPG_05:
  171.     WRITE    CONSL,BEEP
  172.     RETURN
  173.  
  174. BACKUP_PAGE    ENDP
  175. ;
  176. ;
  177. ;-----------------------------------------
  178. ; CONTINUE_SEARCH -- CONTINUE THE TEXT MATCH
  179. ;
  180. CONTINUE_SEARCH    PROC    NEAR
  181.     IF STRING MATCH_STR EQ NULL GOTO CNTSRCH_05
  182.     CALL    FIND_IN_FILE
  183. ;
  184. CNTSRCH_05:
  185.     RETURN
  186.  
  187. CONTINUE_SEARCH    ENDP
  188. ;
  189. ;
  190. ;
  191. ;-----------------------------------------
  192. ; DISPLAY_PAGE -- WRITE ONE PAGE WORTH OF THE FILE
  193. ;          TO THE SCREEN.
  194. ;
  195. DISPLAY_PAGE    PROC    NEAR
  196.     CALL    CLRSCR            ; CLEAR THE SCREEN
  197.     WRITE    CONSL,,CR        ; MOVE DOWN ONE LINE
  198.     POINT    AFILE,PNTR
  199.     @WORKN1    = 23
  200.     @WORKN2 = INDX * 23
  201.     @WORKN2 = FIND_LINE - @WORKN2 + FOUND_STATE
  202. ;
  203. DSPPG_05:
  204.     READ    AFILE,STR,132
  205.     IF WORD STATUS NE ZERO GOTO DSPPG_10
  206.     CALL    PREP_STRING        ; PAD THE TABS
  207. ;
  208.     @WORKN2 = @WORKN2 - 1
  209.     IF WORD @WORKN2 NE ZERO GOTO DSPPG_06
  210.     WRITE    CONSL,BRIGHT
  211. ;
  212. DSPPG_06:
  213.     MOV    BX,[LEFT_MARGIN]
  214.     MOV    SI,OFFSET PADDED
  215.     CALL    _STRLEN            ; GET THE LENGTH
  216.     CMP    BX,CX            ; BX GT LENGTH?
  217.     JLE    DSPPG_07        ; NO, CONTINUE ON...
  218.     MOV    BX,CX            ; YES, SO STOP AT THE END
  219. ;
  220. DSPPG_07:
  221.     ADD    SI,BX
  222.     MOV    BYTE PTR [SI+79],0    ; SET A TERMINATOR TO TRUNCATE THE LINE
  223.     MOV    DI,OFFSET CONSL
  224.     MOV    AL,0FFH
  225.     CALL    _FWRT
  226. ;
  227.     IF WORD @WORKN2 NE ZERO GOTO DSPPG_09
  228.     WRITE    CONSL,DIM
  229. ;
  230. DSPPG_09:
  231.     @WORKN1    = @WORKN1 - 1
  232.     IF WORD @WORKN1 GT ZERO GOTO DSPPG_05
  233. ;
  234. DSPPG_10:
  235.     RETURN
  236.  
  237. DISPLAY_PAGE    ENDP
  238. ;
  239. ;
  240. ;-----------------------------------------
  241. ; FIND_TEXT -- SEARCH THE FILE FOR SOME TEXT
  242. ;
  243. FIND_TEXT    PROC    NEAR
  244.     CURSOR    0,0
  245.     WRITE    CONSL,BLANKS
  246.     CURSOR    0,0
  247.     WRITE    CONSL,M11
  248.     READ    CONSL,MATCH_STR,132
  249.     FIND_LINE = INDX * 23
  250.     MOV    AX, WORD PTR [PNTR+0]
  251.     MOV    WORD PTR [FIND_PNTR+0],AX
  252.     MOV    AX, WORD PTR [PNTR+2]
  253.     MOV    WORD PTR [FIND_PNTR+2],AX
  254.     CALL    FIND_IN_FILE
  255.     RETURN
  256.  
  257. FIND_TEXT    ENDP
  258. ;
  259. ;
  260. ;-----------------------------------------
  261. ; GET_FILE -- GET THE NAME OF A TEXT FILE FROM THE OPERATOR
  262. ;
  263. GET_FILE    PROC    NEAR
  264.     IF STRING STR NE NULL GOTO GTFI_02
  265. ;
  266. GTFI_00:
  267.     WRITE    CONSL,,CR
  268.     WRITE    CONSL,M00
  269.     READ    CONSL,STR,50
  270.     IF STRING STR EQ NULL GOTO GTFI_10
  271. ;
  272. GTFI_02:
  273.     CALL    FMOVE STR AFILE
  274.     OPEN    INPUT,AFILE
  275.     IF WORD STATUS EQ ZERO GOTO GTFI_05
  276.     WRITE    CONSL,BEEP
  277.     WRITE    CONSL,M01,CR
  278.     GOTO    GTFI_00
  279. ;
  280. GTFI_05:
  281.     STATUS    = ZERO
  282.     RETURN
  283. ;
  284. GTFI_10:
  285.     STATUS    = EOF
  286.     RETURN
  287.  
  288. GET_FILE    ENDP
  289. ;
  290. ;
  291. ;--------------------------------------------
  292. ; GOTO_PAGE -- GO TO A SPECIFIC PAGE
  293. ;
  294. GOTO_PAGE    PROC    NEAR
  295.     CURSOR    0,0
  296.     WRITE    CONSL,BLANKS
  297.     CURSOR    0,0
  298.     WRITE    CONSL,M10
  299.     READ    CONSL,STR,6
  300.     IF STRING STR EQ NULL GOTO GTPG_05
  301.     DECODE    @WORKN1,STR
  302.     IF WORD STATUS NE ZERO GOTO GOTO_PAGE
  303.     IF WORD @WORKN1 LT ZERO GOTO GOTO_PAGE
  304.     IF WORD @WORKN1 GT MAX_PAGES GOTO GOTO_PAGE
  305.     INDX    = @WORKN1
  306.     CALL    TBLGET
  307. ;
  308. GTPG_05:
  309.     RETURN
  310.  
  311. GOTO_PAGE    ENDP
  312. ;
  313. ;
  314. ;-------------------------------------------
  315. ; LOAD_FILE  -- LOAD THE TABLE WITH FILE POINTERS
  316. ;        TO THE TEXT FILE
  317. ;
  318. LOAD_FILE    PROC    NEAR
  319.     WRITE    CONSL,M02
  320.     INDX      = ZERO
  321.     MAX_PAGES = MAX_TBL_LENGTH
  322. ;
  323. LDFI_05:
  324.     @WORKN1    = 23
  325.     NOTE    AFILE,PNTR
  326.     CALL    TBLPUT
  327.     INDX    = INDX + 1
  328. ;
  329. LDFI_10:
  330.     READ    AFILE,STR,132
  331.     IF WORD STATUS NE ZERO GOTO LDFI_15
  332.     @WORKN1    = @WORKN1 - 1
  333.     IF WORD @WORKN1 GT ZERO GOTO LDFI_10
  334.     GOTO    LDFI_05
  335. ;
  336. LDFI_15:
  337.     MAX_PAGES = INDX - 1
  338.     RETURN
  339.  
  340. LOAD_FILE    ENDP
  341. ;
  342. ;
  343. ;-------------------------------------------
  344. ; MOVE_LEFT  --  MOVE THE SCREEL LEFT 8 COLUMNS
  345. ;
  346. MOVE_LEFT    PROC    NEAR
  347.     IF WORD LEFT_MARGIN EQ ZERO RETURN
  348.     LEFT_MARGIN = LEFT_MARGIN - 8
  349.     RETURN
  350.  
  351. MOVE_LEFT    ENDP
  352. ;
  353. ;
  354. ;-------------------------------------------
  355. ; MOVE_RIGHT  --  MOVE THE SCREEL RIGHT 8 COLUMNS
  356. ;
  357. MOVE_RIGHT    PROC    NEAR
  358.     IF WORD LEFT_MARGIN EQ 256-80 RETURN
  359.     LEFT_MARGIN = LEFT_MARGIN + 8
  360.     RETURN
  361.  
  362. MOVE_RIGHT    ENDP
  363. ;
  364. ;
  365. ;-------------------------------------------
  366. ; PROMPT_OPERATOR -- GIVE THE OPERATOR THE CURRENT PAGE
  367. ;             NUMBER AND THE OPTIONS PROMPT
  368. ;
  369. PROMPT_OPERATOR    PROC    NEAR
  370.     ENCODE    STR,INDX
  371.     CURSOR    0,0
  372.     WRITE    CONSL,M04
  373.     WRITE    CONSL,STR
  374.     ENCODE    STR,MAX_PAGES
  375.     WRITE    CONSL,M05
  376.     WRITE    CONSL,STR
  377.     WRITE    CONSL,M03
  378.     INKEY    STR,WAIT        ; PROMPT THE OPERATOR FOR ACTION
  379.     AND    BYTE PTR [STR],05FH    ; CONVERT TO UPPERCASE
  380.     RETURN
  381.  
  382. PROMPT_OPERATOR    ENDP
  383. ;
  384. ;
  385. ;=====================
  386. ;   ROUTINE SECTION
  387. ;    LEVEL 2
  388. ;=====================
  389. ;
  390. ;
  391. ;-----------------------------------------
  392. ; FIND_IN_FILE  -- SEARCH THE TEXT FILE FOR A STRING MATCH
  393. ;
  394. FIND_IN_FILE    PROC    NEAR
  395.     POINT    AFILE,FIND_PNTR
  396. ;
  397. FNDINF_05:
  398.     READ    AFILE,STR,132
  399.     IF WORD STATUS NE ZERO GOTO FNDINF_20
  400.     FIND_LINE = FIND_LINE + 1
  401.     CALL    FSTRNG MATCH_STR STR
  402.     JC    FNDINF_05
  403.     NOTE    AFILE,FIND_PNTR
  404.     INDX    = FIND_LINE - 1 / 23
  405.     CALL    TBLGET
  406.     POINT    AFILE,PNTR
  407.     STATUS    = ZERO
  408.     FOUND_STATE = ZERO
  409.     RETURN
  410. ;
  411. FNDINF_20:
  412.     POINT    AFILE,PNTR
  413.     STATUS    = EOF
  414.     FOUND_STATE = -1
  415.     RETURN
  416.  
  417. FIND_IN_FILE    ENDP
  418. ;
  419. ;
  420. ;-------------------------------------
  421. ; PREP_STRING  -- EXPAND THE TABS TO SPACES
  422. ;
  423. ; Entry conditions:
  424. ;    None
  425. ; Exit conditions:
  426. ;    PADDED holds the string to be printed
  427. ;
  428. PREP_STRING    PROC    NEAR
  429.     PUSH    ES
  430.     PUSH    SI
  431.     PUSH    DI
  432. ;
  433.     PUSH    DS
  434.     POP    ES        ; ES = DATA SEGMENT
  435.     MOV    CX,256        ; SETUP THE MAX PAD COUNT
  436.     MOV    SI,OFFSET STR
  437.     MOV    DI,OFFSET PADDED
  438.     CLD
  439.     MOV    AH,09H
  440.     MOV    BX,[BIT_7_FLAG]
  441. ;
  442. PRPSTR_05:
  443.     CMP    AH,[SI]        ; TAB?
  444.     JZ    PRPSTR_20    ; YES, GO PAD IT
  445.     LODSB            ; FETCH THE CHARACTER
  446.     OR    BL,BL        ; TRIM THE 8TH BIT?
  447.     JZ    PRPSTR_10    ; NO...
  448.     AND    AL,07FH        ; TRIM THE 8TH BIT
  449. ;
  450. PRPSTR_10:
  451.     OR    AL,AL        ; TERMINATOR?
  452.     JZ    PRPSTR_12     ; YES, STORE IT AS-IS
  453.     CMP    AL,20H        ; TOO LOW TO PRINT?
  454.     JA     PRPSTR_12    ; NO
  455.     MOV    AL,20H        ; YES, SO FLUSH IT...
  456. ;
  457. PRPSTR_12:
  458.     STOSB            ; & SAVE IT IN THE TARGET STRING
  459.     OR    AL,AL        ; IS IT THE TERMINATOR?
  460.     LOOPNE    PRPSTR_05    ; LOOP UNTIL SO...
  461. ;
  462. PRPSTR_15:
  463.     POP    DI
  464.     POP    SI
  465.     POP    ES
  466.     RETURN
  467. ;
  468. PRPSTR_20:
  469.     INC    SI        ; MOVE PAST THE TAB
  470.     MOV    DX,0007H    ; DL=MASK
  471.     AND    DL,CL
  472.     XCHG    DX,CX        ; DX=REMAINING LENGTH, CX=PADDING COUNT
  473.     JNZ    PRPSTR_21    ; SKIP IF VALUE = 1 - 7
  474.     MOV    CX,08        ; PAD ALL 8 SPACES
  475. ;
  476. PRPSTR_21:
  477.     SUB    DX,CX        ; ADJUST FOR PADDING
  478.     MOV    AL,20H        ; PAD WITH A SPACE
  479.     REP    STOSB        ; STORE IT ALL
  480.     MOV    CX,DX        ; RESTORE THE REMAINING LENGTH
  481.     JCXZ    PRPSTR_15    ; EXIT IF NULL
  482.     JMP    SHORT PRPSTR_05    ; GO PAD MORE...
  483.  
  484. PREP_STRING    ENDP
  485. ;
  486. ;
  487. ;=====================
  488. ;   ROUTINE SECTION
  489. ;    LEVEL 3
  490. ;=====================
  491. ;
  492. ;
  493. ;-------------------------------------
  494. ; TBLGET -- GET THE A TABLE ENTRY
  495. ;
  496. ; Entry conditions:
  497. ;    INDX holds the table subscript
  498. ; Exit conditions:
  499. ;    STATUS = EOF, index out of range
  500. ;    STATUS = 0, PNTR holds the table entry
  501. ;
  502. TBLGET    PROC    NEAR
  503.     STATUS    = EOF
  504.     IF WORD INDX GT MAX_PAGES RETURN    ; EXIT IF INDX IS OUT OF BOUNDS
  505.     IF WORD INDX LT ZERO RETURN
  506.     @SUBSCRIPT = INDX * 4
  507.     MOV    BX,[@SUBSCRIPT]            ; MOVE THE BYTES
  508.     MOV    AX,WORD PTR PNTR+4+0[BX]
  509.     MOV    WORD PTR PNTR+0,AX
  510.     MOV    AX,WORD PTR PNTR+4+2[BX]
  511.     MOV    WORD PTR PNTR+2,AX
  512.     STATUS    = ZERO
  513.     RETURN
  514.  
  515. TBLGET    ENDP
  516. ;
  517. ;
  518. ;-------------------------------------
  519. ; TBLPUT -- PUT THE ENTRY INTO THE TABLE
  520. ;
  521. ; Entry conditions:
  522. ;    INDX holds the table subscript
  523. ; Exit conditions:
  524. ;    STATUS = EOF, index out of range
  525. ;    STATUS = 0, PNTR holds the table entry
  526. ;
  527. TBLPUT    PROC    NEAR
  528.     STATUS    = EOF
  529.     IF WORD INDX GT MAX_PAGES RETURN    ; EXIT IF INDX IS OUT OF BOUNDS
  530.     IF WORD INDX LT ZERO RETURN
  531.     @SUBSCRIPT = INDX * 4
  532.     MOV    BX,[@SUBSCRIPT]            ; MOVE THE BYTES
  533.     MOV    AX,WORD PTR PNTR+0
  534.     MOV    WORD PTR PNTR+4+0[BX],AX
  535.     MOV    AX,WORD PTR PNTR+2
  536.     MOV    WORD PTR PNTR+4+2[BX],AX
  537.     STATUS    = ZERO
  538.     RETURN
  539.  
  540. TBLPUT    ENDP
  541. ;
  542. ENDPGM    LIST
  543. ;
  544.  
  545.