$CPU 8086 ' make compatible with XT systems $LIB ALL OFF ' turn off all PowerBASIC libraries $ERROR ALL OFF ' turn off all PowerBASIC error checking $OPTIMIZE SPEED ' optimize for smaller code $COMPILE UNIT ' compile to a UNIT (.PBU) '$COMPILE EXE ' compile to a UNIT (.PBU) DEFINT A-Z ' Required for all numeric functions, forces PB to not ' include floating point in UNIT (makes it smaller) '/*------------------------------------------------------------------*/ DECLARE FUNCTION RINSTR(BYVAL SP,BYVAL S$,BYVAL F$) AS INTEGER DECLARE SUB BAR(TYP%,ROW%,COL%,LTH%,C$,C2$,ATTR%,ATTR2%,P%) DECLARE SUB BBOX(BYVAL Row AS INTEGER, BYVAL Col AS INTEGER, BYVAL Rows AS INTEGER, BYVAL Cols AS INTEGER, BYVAL Attr AS BYTE, BYVAL OPT AS INTEGER, BYVAL Shad AS INTEGER) DECLARE SUB EBOX(BYVAL TROW AS INTEGER, BYVAL COL AS INTEGER, BYVAL EBATTR AS INTEGER, P AS STRING, EL AS STRING, BYVAL ELTH AS INTEGER, BYVAL TPE AS STRING, BYVAL ATTR AS INTEGER, BYVAL RKEY AS STRING,BYVAL BT AS INTEGER) DECLARE FUNCTION MBOX(ROW,COL,ATTR,MSG$(),OPT$,BTYPE) AS STRING DECLARE SUB SAY(BYVAL Row AS INTEGER, BYVAL Col AS INTEGER, BYVAL Text AS STRING, BYVAL Attr AS INTEGER) DECLARE SUB MCLICKED(Rgt%,Lft%,Row%,Col%) DECLARE SUB MOUSEOFF() DECLARE SUB MOUSEON() DECLARE FUNCTION ISMOUSELBR() DECLARE FUNCTION WORDS(BYVAL X AS STRING) AS INTEGER DECLARE SUB DBOPEN(FB,FILENAME$,LRECL,NRECS#,OFFSET,FD$()) DECLARE FUNCTION WORD(BYVAL X AS STRING,XN AS INTEGER) AS STRING '/*------------------------------------------------------------------*/ $CODE SEG "MLIB4" '/*-----------------------------------------------------------------*/ ' BROWSEF(ATTR,F$,SB&,EB&,ROW,COL,BROW,RCOL,K$,BATTR,BTYYP,MF) ' Browse a File. ' Using the arrow/page home/end keys and optionally use the mouse to move ' around in file. Will browse files up to 2,147,483,647 bytes in length. ' Individual records for fixed length and dBase files may be up to 1391 in ' length. If the record length is greater, shrink the height of the ' window to 5 lines and you will able to browse files with much larger ' record length. ' ' Files may be Fixed/Variable sequential files(CRLF delimited) or ' dBase (.dbf). ' ' If MF > 0 then placing the mouse cursor on a boundry line will ' allow you to use the mouse button to scroll in that direction. ' Use the left mouse button to scroll by left/right or up/down. ' Use the right mosue button to scroll by pages left/right up/down. ' ' You may press F to invoke the text search feature. When F is ' pressed a window is diplayed allowing you to enter text you ' wish to search for. The search begins with the First line of the ' file. Case of the text is ignored. ' ' Press N to search from the current page (after 1st match). ' If no match is found, either 1st time or subsequent, a message ' box is displayed. ' ' Unlike other BROWSE functions, BROWSEF will display a full 80 ' characters on each line if desired. ' ' Returns exit key. ' ' ATTR = Color of text. ' F$ = Fully qualified file name to browse. ' SB& = Start byte. This is a long integer number allowing ' browsing of up to a 2G file. If 0 browse begins at the ' first page. ' EB& = Last byte. If 0 then LOF is used. ' ROW = Top row of browse window. ' COL = Left column of browse window. ' BROW = Bottom row to browse. ' RCOL = Right most column of browse window. ' KEY$ = Keys that will exit browser. ESC is the default. ' BATTR = Color of box around browse window. ' BTYPE = Type of box around browse window. (See TBOX for types). ' MF = Use Mouse: ' 0 = No ' 1 = Yes ' If MF > 1 then a scroll bar is placed on the right side ' of the box. ' EXAMPLE: T$ = BROWSEF(31,F$,0,0,1,12,80,"",12,1,1) ' '/*-----------------------------------------------------------------*/ FUNCTION BROWSEF(BYVAL ATTR, BYVAL F$, BYVAL SB&, BYVAL EB&, BYVAL TopView%, BYVAL LeftView%, BYVAL BottomView%, BYVAL RightView%, BYVAL K$, BYVAL BOXATTR%, BYVAL BOXTYPE%, BYVAL DMOUSE%) PUBLIC AS STRING REDIM MSG$(10) REDIM DFD$(75) '/*--- Resolve File Name ---*/ IF WORDS(F$) > 1 THEN FLRECL = VAL(WORD(F$,2)) F$ = WORD(F$,1) FLRECLFLAG = 1 END IF '/*--- Center Browse Box? ---*/ IF TopView% = 0 THEN TopView% = 12 - (BottomView%/2) END IF IF LeftView% = 0 THEN LeftView% = 40 - (RightView%/2) END IF IF BottomView% > 25 THEN BottomView% = 25 IF RightView% > 80 THEN RightView% = 80 TopRow% = TopView% BottomRow% = BottomView% RightColumn% = RightView% LeftColumn% = LeftView% '/*--- Put Box on Screen ---*/ BBOX TopRow%, LeftColumn%, BottomRow%, RightColumn%, BOXATTR%, BOXTYPE%,0 IF DMOUSE% > 1 THEN BLTH =BottomView%-TopView%-2 TBAR = TopView%+1 IF BLTH < 3 THEN BLTH = 0 ELSE BLTH = 0 END IF '/*--- Initialize Vars ---*/ SHARED Boffset% :'/* horizontal movement SHARED Ptr% :'/* starting byte for view (1 is top of file) IF Ptr% = 0 THEN Ptr% = 1 :'/* starting byte for view (1 is top of file) IF BOXTYPE% < 15 THEN TopView% = TopRow%+1 BottomView% = BottomRow% - 1 END IF IF BOXTYPE% < 13 THEN INCR LeftView% DECR RightView% END IF WideNess%=RightView%-LeftView%+1 IF BOXTYPE = 15 THEN BottomView% = BottomRow% BLTH = 0 END IF '/* --- Determine Screen Size ---*/ PSIZE = BottomView% - TopView% + 2 '/*--- Check for Termination Keys ---*/ IF K$ = "" THEN K$ = CHR$(27) '/* Boffset% = 0 '/* --- Get File Info ---*/ FFN = FREEFILE :'/*Get Next Free Buffer IF RIGHT$(F$,4) = ".DBF" THEN DBFLAG = 1 LRECL = 0 NR# = 0 OFFSET = 0 DBOPEN FFN,F$,LRECL,NR#,OFFSET,DFD$() NRECS& = NR# FSIZE& = LOF(FFN) FLRECL = LRECL PBYTES = LRECL * PSIZE FLRECLF = 1 SB& = OFFSET + 1 ELSE DBFLAG = 0 OPEN"I",FFN,F$ LINE INPUT#FFN,D$ IF FLRECLFLAG = 1 THEN FSIZE& = LOF(FFN) LRECL = FLRECL NRECS& = (FSIZE& / LRECL) PBYTES = (FLRECL+2)*(PSIZE) FLRECLF = 1 DBFLAG = 1 ELSE FSIZE& = LOF(FFN) LRECL = LEN(D$) + 2 NRECS& = (FSIZE& / LRECL) IF (RIGHT$(D$,1) = ":" OR RIGHT$(D$,1) = "*") AND (NRECS&*LRECL) = FSIZE& THEN FLRECL = LEN(D$) PBYTES = (FLRECL+2)*(PSIZE) FLRECLF = 1 ELSE '/* IF LOF(FFN) < 32000 THEN PBYTES = LOF(FFN) ELSE PBYTES = 10000 PBYTES = 10000 '/* PBYTES = 32000 FLRECLF = 0 END IF END IF END IF CLOSE#FFN FFN = FREEFILE OPEN F$ FOR BINARY AS #FFN IF EB& = 0 THEN FBYTES& = LOF(FFN) ELSE FBYTES& = EB& MAL& = FBYTES& '/* --- Virtual Control Keys ---*/ VCK$ = CHR$(00,73) + CHR$(00,81) + CHR$(00,80) + CHR$(00,72) VCK$ = VCK$ + CHR$(00,71) + CHR$(00,79) SBYTE& = SB& GOSUB GETBYTES GOSUB GETPAGE '/* --- Start Loop ---*/ DO ALCNT = 0 LCNT = 0 PB = 1 EL = 0 FOR LCNT = 1 TO PSIZE-1 EL = INSTR(PB,T$,CHR$(13,10)) PB = EL + 2 IF PB => LEN(T$) THEN EXIT FOR INCR ALCNT NEXT LCNT IF PB > LEN(T$) THEN PB = LEN(T$) A$ = LEFT$(T$,PB) CK$ = K$ + VCK$ '/* --- Display it ---*/ IF DMOUSE% THEN MOUSEOFF TempPtr% = Ptr% : Temp% = TopView% REPLACE " " WITH " " IN A$ DO '/* --- TempPtr% is byte position of current line, calculate offset of end of line eol% = Instr(Mid$(A$,TempPtr%),Chr$(13)) '/* ---if there are no more carriage returns, then eol% is the end of A$ if eol%=0 then eol%=LEN(A$) ELSE DECR eol% :'/* DECR: do not show the CR '/* --- get the current line as Curr$ Curr$ = Mid$(A$, TempPtr%,eol%) '/* --- display the current line SAY Temp%, LeftView%, Mid$(Curr$+Space$(WideNess%+Boffset%), 1+Boffset%,WideNess%), ATTR IF LEN(F1$) > 0 AND INSTR(1,UCASE$(Curr$),F1$) > 0 THEN SAY Temp%, LeftView%, Mid$(Curr$+Space$(WideNess%+Boffset%), 1+Boffset%,WideNess%),79 END IF '/* --- increment the pointer to the next line to display in the window TempPtr% = Instr(TempPtr%, A$, Chr$(13)) + 2 ' +2 for CRLF pair '/* --- if we have reached the end then we don't show any more If TempPtr%=2 Then TempPtr%=LEN(A$)+1 A$ = A$ + " " END IF '/* --- get ready to display the next line... INCR Temp% ' inless we are done, in which case, we have finished with the screen if Temp% > BottomView% THEN Exit LOOP LOOP '/*--- Display Scroll Bar ---*/ IF BLTH > 0 THEN IF SBYTE& = MAL& THEN P = 100 ELSE P = (SBYTE&/MAL&)*100 BAR 1,TBAR,RightColumn%,BLTH,CHR$(176),CHR$(254),BOXATTR%,BOXATTR%,P END IF '/*--- Check Mouse Until Key is Pressed ---*/ WHILE NOT INSTAT IF DMOUSE% THEN MOUSEON Rgt% = 0:Lft% = 0:MRow% = 0:MCol% = 0 MCLICKED Rgt%,Lft%,MRow%,MCol% '/* --- Exit? --- IF MCol% = LeftColumn% AND MROW = TopRow% AND ISMOUSELBR THEN KB$ = CHR$(27): GOTO KeyBoardRoutine '/* --- Left Mouse Button Pressed? --- IF Lft% THEN '/* --- Left Arrow? --- IF MCol% = LeftColumn% THEN KB$ = CHR$(0,75): GOTO KeyBoardRoutine '/* --- Right Arrow? --- IF MCol% = Rightcolumn% THEN KB$ = CHR$(0,77): GOTO KeyBoardRoutine '/* --- Up Arrow? --- IF MRow% = TopRow% THEN KB$ = CHR$(0,72): GOTO KeyBoardRoutine '/* --- Down Arrow? --- IF MRow% = BottomRow% THEN KB$ = CHR$(0,80): GOTO KeyBoardRoutine END IF '/* --- Right Mouse Button Pressed? --- IF Rgt% THEN '/* --- Left Tab? --- IF MCol% = LeftColumn% THEN KB$ = CHR$(0,15): GOTO KeyBoardRoutine '/* --- Right Tab? --- IF MCol% = Rightcolumn% THEN KB$ = CHR$(9): GOTO KeyBoardRoutine '/* --- Up Page? --- IF MRow% = TopRow% THEN KB$ = CHR$(0,73): GOTO KeyBoardRoutine '/* --- Down Page? --- IF MRow% = BottomRow% THEN KB$ = CHR$(0,81): GOTO KeyBoardRoutine END IF END IF WEND KB$ = INKEY$ KeyBoardRoutine: '/* --- User Exit Key Selected? ---*/ S = INSTR(1,K$,KB$) IF S > 0 THEN IF DMOUSE% THEN MOUSEOFF FUNCTION = KB$ EXIT LOOP END IF '/* --- Down Arrow? ---*/ IF KB$ = CHR$(00,80) THEN B8: IF ALCNT < PSIZE-1 THEN ITERATE HSBYTE& = SBYTE& IF DBFLAG > 0 THEN SBYTE& = SBYTE& + LRECL ELSE SBYTE& = SBYTE& + INSTR(1,A$,CHR$(13,10)) + 1 END IF IF SBYTE& => FBYTES& THEN SBYTE& = HSBYTE& GOSUB GETBYTES ITERATE END IF '/* --- Page Down? ---*/ IF KB$ = CHR$(00,81) THEN IF ALCNT < PSIZE-1 THEN ITERATE HSBYTE& = SBYTE& IF DBFLAG > 0 THEN SBYTE& = SBYTE& + PBYTES - LRECL - LRECL ELSE SBYTE& = SBYTE& + LEN(A$) -1 END IF IF SBYTE& => FBYTES& THEN SBYTE& = HSBYTE& GOSUB GETBYTES ITERATE END IF '/* --- Home? ---*/ IF KB$ = CHR$(00,71) THEN B7: SBYTE& = SB& GOSUB GETBYTES ITERATE END IF '/* --- End? ---*/ IF KB$ = CHR$(00,79) THEN SBYTE& = FBYTES& KB$ = CHR$(00,73) END IF '/* --- Up Arrow? ---*/ IF KB$ = CHR$(00,72) THEN IF DBFLAG > 0 THEN SBYTE& = SBYTE& - LRECL ELSE DECR SBYTE&,2 DO IF SBYTE& < SB& THEN SBYTE& = SB& SEEK FFN,SBYTE& GET$ #FFN,1,TT$ IF DBTYPE = 1 THEN EXIT LOOP IF TT$ = CHR$(10) THEN EXIT LOOP DECR SBYTE& IF SBYTE& < SB& THEN EXIT LOOP LOOP SBYTE& = SBYTE& + 1 END IF GOSUB GETBYTES ITERATE END IF '/* --- Page Up? ---*/ IF KB$ = CHR$(00,73) THEN '/* --- LRECL NOT Fixed? --- IF FLRECLF = 0 AND DBFLAG = 0 THEN FOR CNT = 1 TO PSIZE-1 DECR SBYTE&,2 DO IF SBYTE& < SB& THEN SBYTE& = SB& SEEK FFN,SBYTE& GET$ #FFN,1,TT$ IF TT$ = CHR$(10) THEN EXIT LOOP DECR SBYTE& IF SBYTE& < SB& THEN EXIT LOOP LOOP NEXT CNT SBYTE& = SBYTE& + 1 GOSUB GETBYTES ITERATE ELSE SBYTE& = SBYTE& - PBYTES IF SBYTE& < SB& THEN GOTO B7 ELSE IF DBFLAG > 0 THEN SBYTE& = SBYTE& + LRECL + LRECL ELSE IF FLRECLF = 1 THEN SBYTE& = SBYTE& + FLRECL +2 END IF GOSUB GETBYTES ITERATE END IF END IF END IF '/* --- Control Home? ---*/ IF KB$ = CHR$(0,119) THEN Boffset% = 0 ITERATE END IF '/* --- Tab Right? ---*/ IF KB$ = CHR$(9) THEN Boffset% = Boffset% + 10 ITERATE END IF '/* --- Right Arrow? ---*/ IF KB$ = CHR$(0,77) THEN INCR Boffset% ITERATE END IF '/* --- Left Arrow? ---*/ IF KB$ = CHR$(0,75) THEN If Boffset% THEN DECR Boffset% ITERATE END IF '/* --- Left Tab? ---*/ IF KB$ = CHR$(00,15) THEN Boffset% = Boffset% - 10 IF Boffset% < 0 THEN Boffset% = 0 ITERATE END IF '/* --- Find First? ---*/ IF UCASE$(KB$) = "F" OR UCASE$(KB$) = "N" THEN IF UCASE$(KB$) = "F" THEN ERKEY$ = CHR$(27,13) EBOX 0,0,48,"Enter String to find >",F1$,100,"TITLE'Find 1st String' UPPER",31,ERKEY$,1 IF F1$ = "" OR WORDS(F1$) = 0 THEN F1$ = "" ITERATE END IF F1$ = TRIM$(F1$) SBYTE& = SB& FHSBYTE& = SBYTE& ELSE FHSBYTE& = SBYTE& IF DBFLAG > 0 THEN SBYTE& = SBYTE& + PBYTES - LRECL IF DBFLAG < 1 THEN SBYTE& = SBYTE& + LEN(A$) -1 END IF IF F1$ <> "" THEN '/* SAY BottomView%+1,LeftColumn%+4,STRING$(60,BCHAR$),BOXATTR% DO GOSUB GETBYTES LCNT = 0 PB = 1 EL = 0 FOR LCNT = 1 TO PSIZE-1 EL = INSTR(PB,T$,CHR$(13,10)) PB = EL + 2 NEXT LCNT A$ = LEFT$(T$,PB) '/* SAY BottomView%+1,LeftColumn%+4," Searching Lines"+STR$(SLINE&)+" -"+STR$(ELINE&)+" of"+STR$(TLINES&),STATATTR% S = INSTR(1,UCASE$(A$),F1$) IF S > 0 THEN ITERATE END IF IF DBFLAG > 0 THEN SBYTE& = SBYTE& + PBYTES - LRECL IF DBFLAG < 1 THEN SBYTE& = SBYTE& + LEN(A$) -1 '/* SBYTE& = SBYTE& + LEN(A$) -1 '/* SAY 25,1,STR$(SBYTE&)+STR$(FBYTES&)+STR$(S),29 LOOP UNTIL SBYTE&+1 => FBYTES& OR S > 0 '/* Y$ = GETKEY IF S = 0 THEN MSG$(1) = F1$ MSG$(2) = " " MSG$(3) = "Not Found!" MSG$(4) = " " MSG$(5) = "Press Any Key to Continue" MSG$(6) = "" T$ = MBOX(0,0,79,MSG$()," ANYKEY ",7) '/* MBOX MSG$(),"",0,0,3,0,0,79,0,7 SBYTE& = FHSBYTE& GOSUB GETBYTES ITERATE END IF END IF END IF LOOP GOTO BROWSEFE1 '/*-----------------------------------------------------------------*/ GETPAGE: RETURN '/*-----------------------------------------------------------------*/ GETBYTES: IF SBYTE& < SB& THEN SBYTE& = SB& GB = PBYTES IF (SBYTE&+GB) > FBYTES& THEN GB = FBYTES&-SBYTE&+1 IF FBYTES& < PBYTES THEN GB = FBYTES& '/* SAY 25,1,STRING$(80,32),7 '/* SAY 25,1,STR$(GB)+STR$(FLRECL),31 '/* Y$ = GETKEY SEEK FFN,SBYTE& '/* IF SBYTE& > FSIZE& THEN RETURN '/* --- Load Data Page ---*/ GET$ #FFN,GB,T$ IF DBFLAG > 0 THEN A$ = T$ T$ = "" SP = 1 FOR CNT = 1 TO PSIZE T$ = T$ + MID$(A$,SP,LRECL) + CHR$(13,10) SP = SP + LRECL NEXT CNT END IF RETURN '/*-----------------------------------------------------------------*/ BROWSEFE1: CLOSE#FFN END FUNCTION '/*-----------------------------------------------------------------*/ ' $INCLUDE "C:\CODE\MLIB\MLIB.INC" ' DIM MSG$(3) ' H$ = GETSCREEN ' F$ = UCASE$(COMMAND$) ' IF EXIST(F$) > 0 THEN ' if words(f$) > 1 then SB& = VAL(WORD(F$,2)) else sb& = 0 ' if words(f$) > 2 then EB& = VAL(WORD(F$,3)) else eb& = 0 ' F$ = WORD(F$,1) ' BROWSERECMDSTART: ' KT$ = CHR$(27) + CHR$(0,68) ' SAY 25,1,SUBSTR(F$,1,49," ")+CHR$(24,25,27,26)+" Home/End/Pgup/Pgdn F/N F10",2 ' T$ = BROWSEF(7,F$,SB&,EB&,1,1,24,80,KT$,11,13,1) ' IF T$ = CHR$(0,68) THEN ' RTRN = YNBOX("","Print this File?",0,48,52,1,1) ' IF RTRN = 0 THEN GOTO BROWSERECMDSTART ' MSG$(1) = "Printing "+F$+" ..." ' MSG$(2) = "" ' Y$ = MBOX(0,0,79,MSG$()," DEXIT ",1) ' SETHP " INIT MLIBL20 " ' MEMPACK ' SHELL "COPY "+F$+" PRN" ' SETHP " FF INIT " ' GOTO BROWSERECMDSTART: ' END IF ' END IF ' PUTSCREEN H$