home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
clarion
/
dirdemo.zip
/
DIRECT.CLA
< prev
next >
Wrap
Text File
|
1990-03-21
|
13KB
|
350 lines
MEMBER('DIRDEMO') !DIRECT.CLA
DIREC_SHOW FUNCTION( DIRECTORY, PATTERN )
SCREEN SCREEN WINDOW(15,71),PRE(SCR),HUE(15,1)
ROW(2,3) PAINT(10,67),HUE(0,7)
ROW(1,1) STRING('╔═══╡<0{13}>═{52}╗')
ROW(2,1) REPEAT(10);STRING('║<0{69}>║') .
ROW(12,1) STRING('╠═{9}<0{51}>═{9}╣')
ROW(13,1) REPEAT(2);STRING('║<0{69}>║') .
ROW(15,1) STRING('╚═{60}<0{8}>═╝')
ROW(13,31) STRING('<24,25>'),HUE(14,1)
COL(34) STRING('PgUp PgDn'),HUE(14,1)
ROW(14,30) STRING('Enter = Select'),HUE(14,1)
ROW(15,62) STRING('Esc=Quit'),HUE(14,1)
LU ROW(2,3) STRING(1),HUE(0,7)
RU COL(69) STRING(1),HUE(0,7)
LD ROW(11,3) STRING(1),HUE(0,7)
RD COL(69) STRING(1),HUE(0,7)
S_PATT ROW(1,6) STRING(13)
MSG ROW(12,11) STRING(51)
ROW(15,44) ENTRY,USE(?FIRST_FIELD)
REPEAT(10),INDEX(NDX)
ROW(2,4) POINT(1,65),USE(?POINT),ESC(?-1)
NAME COL(5) STRING(63)
. .
PTR LONG !ENTRY POINTER FOR KEY TABLE
NDX BYTE !REPEAT INDEX FOR POINT AREA
ROW BYTE !ACTUAL ROW OF SCROLL AREA
COL BYTE !ACTUAL COLUMN OF SCROLL AREA
COUNT BYTE(10) !NUMBER OF ITEMS TO SCROLL
ROWS BYTE(10) !NUMBER OF ROWS TO SCROLL
COLS BYTE(65) !NUMBER OF COLUMNS TO SCROLL
DIRGRP GROUP,PRE(GRP)
DIRREC GROUP
BYTE,DIM(21) !USED BY NEXTDIR
ATTRIB BYTE !FILE ATTRIBUTE IN DOS FORMAT
TIME SHORT !FILE TIME IN DOS FORMAT
DATE SHORT !FILE DATE IN DOS FORMAT
FILESIZE LONG !FILE SIZE IN BYTES
NAME STRING(13) !FILENAME
PORS STRING(9) !PREVIOUS OR SUBDIRECTORY
. .
DIRTBL TABLE,PRE(TBL)
DIRECTRY STRING(60) !DIRECTORY
.
NO_FILES EQUATE('NO MORE FILES')
DIRECTORY STRING(60)
PATTERN STRING(12)
RET_STRING STRING(60)
SAVE_DIR STRING(60),DIM(80) !FOR DIRECTORY LEVEL READING
SAVE_NAME STRING(12),DIM(80)
COUNTER BYTE !LOOP COUNTER
BACKING_UP BYTE !FLAG
FIRST_N_ROOT BYTE !FLAG
EJECT
CODE
RET_STRING = ''
IF OMITTED(1) OR DIRECTORY = '' !IF PATH NOT SUPPLIED
DIRECTORY = PATH() !USE DEFAULT
. ! END IF OMITTED(1) OR DIRECTORY = ''
IF OMITTED(2) OR PATTERN = '' !IF PATTERN NOT SUPPLIED
PATTERN = '*.*' !USE ALL
. ! END IF OMITTED(2) OR PATTERN = ''
CLEAR(SAVE_DIR[]) !CLEAR ARRAY
SAVE_DIR[1] = DIRECTORY !SAVE STARTING DIR
ACTION# = ACTION !SAVE ACTION
OPEN(SCREEN) !OPEN THE SCREEN
SETCURSOR !TURN OFF ANY CURSOR
PTR = 1 !START AT TABLE ENTRY
NDX = 1 !PUT SELECTOR BAR ON TOP ITEM
ROW = ROW(?POINT) !REMEMBER TOP ROW AND
COL = COL(?POINT) !LEFT COLUMN OF SCROLL AREA
RECORDS# = TRUE !INITIALIZE RECORDS FLAG
LOOP !LOOP UNTIL USER EXITS
ACTION = ACTION# !RESTORE ACTION
ALERT !RESET ALERTED KEYS
ALERT(REJECT_KEY) !ALERT SCREEN REJECT KEY
ALERT(ACCEPT_KEY) !ALERT SCREEN ACCEPT KEY
ACCEPT !READ A FIELD
MEM:MESSAGE = '' !CLEAR MESSAGE AREA
IF KEYCODE() = REJECT_KEY THEN BREAK. !RETURN ON SCREEN REJECT KEY
EDIT_RANGE# = FIELD() !SET ONE FIELD EDIT RANGE
IF KEYCODE() = ACCEPT_KEY AND | !ON SCREEN ACCEPT KEY
EDIT_RANGE# <> ?POINT ! AND NOT ON THE POINT FIELD
UPDATE ! MOVE ALL FIELDS FROM SCREEN
EDIT_RANGE# = ?POINT - 1 ! AND EDIT REMAINING FIELDS
SELECT(?POINT) ! IF OK THEN START HERE NEXT
. !
LOOP FIELD# = FIELD() TO EDIT_RANGE# !EDIT FIELDS IN THE EDIT RANGE
CASE FIELD# !JUMP TO FIELD EDIT ROUTINE
OF ?FIRST_FIELD !FROM THE FIRST FIELD
IF KEYCODE() = ESC_KEY OR | ! RETURN ON ESC KEY
RECORDS# = FALSE ! OR NO RECORDS
GOTO DONE ! TO SET RETURN AND CLEAR
.
PTR = 1 !START AT TABLE ENTRY
NDX = 1 !PUT SELECTOR BAR ON TOP ITEM
DO BUILD_TABLE !BUILD MEMORY TABLE OK KEYS
RECORDS# = TRUE ! ASSUME THERE ARE RECORDS
OF ?POINT !PROCESS THE POINT FIELD
IF ~RECORDS(DIRTBL) !IF THERE ARE NO RECORDS
TBL:DIRECTRY = '<<NO SUBS>'
ADD(DIRTBL)
PTR = 1 ! POINT TO FIRST RECORD
NDX = 1 ! POINT TO TOP ITEM
DO SHOW_TABLE
BREAK ! END THE EDITS
. ! END IF ~RECORDS(DIRTBL) !IF THERE ARE NO RECORDS
CASE KEYCODE() !PROCESS THE KEYSTROKE
OF ENTER_KEY !ENTER KEY OR
OROF ACCEPT_KEY !CTRL-ENTER KEY
DO GET_RECORD ! READ THE SELECTED RECORD
IF ERROR() ! IF RECORD HAS BEEN DELETED
MEM:MESSAGE = ERROR() ! TELL USER WHAT HAPPENED
SELECT(?) ! STAY IN THE POINT FIELD
DO BUILD_TABLE ! REBUILD TABLE
BREAK ! AND GET ANOTHER KEY
.
ACTION = 0 ! SET ACTION TO COMPLETE
GOTO DONE ! TO SET RETURN AND CLEAR
! OF INS_KEY !INS KEY
! OF DEL_KEY !DEL KEY
OF DOWN_KEY !DOWN ARROW KEY
IF PTR <= RECORDS(DIRTBL)-COUNT ! IF THERE ARE MORE ENTRIES
SCROLL(ROW,COL,ROWS,COLS,ROWS(?POINT)) ! SCROLL THE SCREEN UP
PTR += 1 ! SET TO THE NEXT ENTRY
DO SHOW_RECORD ! AND DISPLAY THE RECORD
.
DO ARROW_CHECK ! SHOW OR REMOVE ARROWS
OF PGDN_KEY !PAGE DOWN KEY
IF PTR >= RECORDS(DIRTBL)-COUNT+1 ! ON THE LAST PAGE
NDX = COUNT. ! POINT TO BOTTOM ITEM
PTR += COUNT ! OTHERWISE
DO SHOW_TABLE ! DISPLAY THE NEXT PAGE
OF CTRL_PGDN !CTRL-PAGE DOWN KEY
PTR = RECORDS(DIRTBL) - COUNT + 1 ! SET TO LAST PAGE
NDX = COUNT ! POINT TO BOTTOM ITEM
DO SHOW_TABLE ! DISPLAY THE LAST PAGE
OF UP_KEY !UP ARROW KEY
IF PTR > 1 ! IF THERE IS A PRIOR RECORD
PTR -= 1 ! SET TO PRIOR RECORD
SCROLL(ROW,COL,ROWS,COLS,-(ROWS(?POINT)))! SCROLL THE SCREEN DOWN
DO SHOW_RECORD ! DISPLAY THE RECORD
.
DO ARROW_CHECK ! SHOW OR REMOVE ARROWS
OF PGUP_KEY !PAGE UP KEY
IF PTR = 1 THEN NDX = 1. ! ON FIRST PAGE POINT TO TOP
PTR -= COUNT ! OTHERWISE BACK UP 1 PAGE
DO SHOW_TABLE ! AND DISPLAY IT
OF CTRL_PGUP !CTRL-PAGE UP
PTR = 1 ! POINT TO FIRST RECORD
NDX = 1 ! POINT TO TOP ITEM
DO SHOW_TABLE ! AND DISPLAY THE FIRST PAGE
.
. . . !
DONE ! GOTO LABEL FOR RETURN
IF CLIP(TBL:DIRECTRY) <> '<<NO SUBS>' ! IF OK SET RETURN STRING
RET_STRING = TBL:DIRECTRY
. ! END IF CLIP(TBL:DIRECTRY <> '<<NO SUBS>'
FREE(DIRTBL) !FREE MEMORY TABLE
RETURN(RET_STRING) !AND RETURN TO CALLER
BUILD_TABLE ROUTINE !BUILD MEMORY TABLE
SETHUE(31,1)
SCR:MSG = CENTER( 'Building List, Please Wait', SIZE(SCR:MSG) )
SETHUE()
FREE(DIRTBL) !EMPTY THE TABLE
DIRECTORY = FULL_PATH(SAVE_DIR[1], PATTERN) !SET TO PATH + PATTERN
SCR:S_PATT = CLIP(PATTERN) & '<198>' & ALL('<205>')
COUNTER = 1 !START COUNTER
BACKING_UP = FALSE !FLAG FOR UP OR DOWN TREE
IF CLIP(SAVE_DIR[1]) = '\' OR LEN(CLIP(SAVE_DIR[1])) = 3 ! IF SEARCH IN ROOT
FIRST_N_ROOT = FALSE !FLAG TO CORRECT DOS1 LEM ERR
ELSE
FIRST_N_ROOT = TRUE !FLAG TO CORRECT DOS1 LEM ERR
. ! END IF CLIP(SAVE_DIR[1]) = '\'
OMIT('END')
╔═══════════════════════════════════════════════════════════════════════════╗
║ The FIRST_N_ROOT flag simply alerts a later check that this search ║
║ started in a root directory. This is because the DOS1.LEM seem to ║
║ return '.' and '..' if in subdirectory as the very first two entries. ║
║ However, if in the root dir, the DOS1.LEM sets itself to the first ║
║ name in the dir when SETDIR is called. GRP:NAME can be checked after ║
║ a SETDIR call and it will be equal to the first dir entry. I do not ║
║ believe it should get set until NEXTDIR, but it does get set. This ║
║ caused problems backing up the Dir Tree into the root the first time. ║
║ (see loop below on backing up) This is why the FIRST_N_ROOT variable ║
║ is used. ║
╚═══════════════════════════════════════════════════════════════════════════╝
END OMISSION
SETDIR(DIRECTORY,DIRGRP) !SET PATTERN FOR DIRECTORY
LOOP !THRU ALL DIRECTORIES
LOOP !LOOP THRU A DIRECTORY
NEXTDIR(DIRGRP) ! GET A DIRECTORY ENTRY
IF ERROR() = NO_FILES ! END LOOP IF NO MORE FILES
COUNTER -= 1 ! SET COUNTER TO BACK UP LEVEL
BACKING_UP = TRUE ! FLAG BACK UP ONE LEVEL
BREAK
ELSIF ERROR()
STOP(ERROR())
. ! END IF ERROR() = NO_FILES ! END LOOP IF NO MORE FILES
IF GRP:NAME = '.' ! IF PREVIOUS DIR THEN CYCLE
CYCLE
ELSIF GRP:NAME = '..' ! IF PREVIOUS DIR THEN CYCLE
CYCLE
ELSIF ~BAND(GRP:ATTRIB,10H) ! IF ENTRY IS NOT SUB DIR
CYCLE
. ! END IF
TBL:DIRECTRY = FULL_PATH(SAVE_DIR[COUNTER], GRP:NAME)
ADD(DIRTBL) ! ADD TO TABLE
IF ERROR() ! IF THERE WAS AN ERROR
STOP(ERROR()) ! DISPLAY ERROR MESSAGE
. ! END IF
COUNTER += 1 !SET TO GO DOWN ONE LEVEL
SAVE_DIR[COUNTER] = TBL:DIRECTRY !SAVE CURRENT DIR NAME
SAVE_NAME[COUNTER] = GRP:NAME !SAVE CURRENT GRP:NAME
BREAK
. !END LOOP THRU A DIRECTORY
IF COUNTER < 1 THEN BREAK. !NO FILES LEFT IN ROOT
DIRECTORY = FULL_PATH(SAVE_DIR[COUNTER], PATTERN)
SETDIR(DIRECTORY,DIRGRP) !SET PATTERN FOR DIRECTORY
IF BACKING_UP !BACKING UP DIR TREE
BACKING_UP = FALSE
IF COUNTER = 1 AND ~FIRST_N_ROOT !CAN NOT EXPLAIN THIS ONE
!WHENEVER SETDIR SETS TO
!ROOT, GRP:NAME RETURNS AS
!FIRST DIR ENTRY, EVEN BEFORE
!DOING NEXTDIR. THIS WOULD NOT
!ALLOW BACKUP LOOP TO EVEN
!START. SEEMS TO BE A BUG
!IN THE DOS LEM.
FIRST_N_ROOT = TRUE
NEXTDIR(DIRGRP) ! GET A DIRECTORY ENTRY
ELSE
LOOP UNTIL CLIP(SAVE_NAME[COUNTER + 1]) = CLIP(GRP:NAME) !RE-POSITION
NEXTDIR(DIRGRP) ! GET A DIRECTORY ENTRY
IF ERROR() THEN STOP(ERROR()). !
. ! END LOOP UNTIL CLIP(SAVE_NAME[COUNTER + 1]) = CLIP(GRP:NAME)
. ! END IF COUNTER = 1 AND ~FIRST_N_ROOT
. ! END IF BACKING_UP
. ! END LOOP THRU ALL DIRECTORIES
DO SORT_TABLE
SCR:MSG = ALL('<205>') !RE-FILL TRACK
DO SHOW_TABLE !DISPLAY A PAGE OF RECORDS
SORT_TABLE ROUTINE !SORT TABLE ENTRIES
SETHUE(31,1)
SCR:MSG = CENTER( 'Sorting List', SIZE(SCR:MSG) )
SETHUE()
SORT(DIRTBL,TBL:DIRECTRY) !SORT TABLE INTO KEY SEQUENCE
SHOW_TABLE ROUTINE !DISPLAY A PAGE OF RECORDS
IF PTR > RECORDS(DIRTBL)-COUNT+1 ! FOR A PARTIAL PAGE
PTR = RECORDS(DIRTBL)-COUNT+1. ! SET TO THE LAST RECORD
IF PTR < 1 THEN PTR = 1. ! AND BACK UP ONE PAGE
NDX# = NDX ! SAVE REPEAT INDEX
LOOP NDX = 1 TO COUNT ! LOOP THRU THE SCROLL AREA
IF NDX > RECORDS(DIRTBL) THEN BREAK.
DO SHOW_RECORD ! DISPLAY A RECORD
. !
NDX = NDX# ! RESTORE REPEAT INDEX
IF NDX > RECORDS(DIRTBL) THEN NDX = RECORDS(DIRTBL).!SHOWING THE LAST
IF RECORDS(DIRTBL) < COUNT ! IF RECORDS DO NOT FILL
NDX#= RECORDS(DIRTBL) * 1 ! GET NUMBER TIMES SIZE
BLANK(ROW + NDX#,COL,ROWS-NDX#,COLS) ! BLANK REMAINING AREA
.
DO ARROW_CHECK ! SHOW OR REMOVE ARROWS
SHOW_RECORD ROUTINE !DISPLAY A RECORD
GET(DIRTBL,PTR+NDX-1) ! GET THE TABLE ENTRY
IF ~ERROR()
DO SHOW_LINE ! DISPLAY SCROLLING LINE
. ! END IF ~ERROR()
SHOW_LINE ROUTINE !DISPLAY SCROLLING LINE
SCR:NAME = TBL:DIRECTRY
GET_RECORD ROUTINE !READ SELECTED RECORD
GET(DIRTBL,PTR+NDX-1) ! GET THE TABLE ENTRY
FIND_RECORD ROUTINE !LOCATE REQUESTED RECORD
GET(DIRTBL,TBL:DIRECTRY) ! GET THE TABLE ENTRY
PTR = POINTER(DIRTBL) ! SET RECORD POINTER
IF ~PTR THEN PTR = RECORDS(DIRTBL). ! SET TO LAST IF NO POINTER
GET(DIRTBL,PTR) ! AND READ THE DATA RECORD
DO SHOW_TABLE ! DISPLAY THAT PAGE
ARROW_CHECK ROUTINE
IF PTR = 1
SCR:LU = ''
SCR:RU = ''
ELSE
SCR:LU = '<24>'
SCR:RU = '<24>'
. ! END IF PTR = 1
IF PTR >= RECORDS(DIRTBL)-COUNT+1 ! ON THE LAST PAGE
SCR:LD = ''
SCR:RD = ''
ELSIF PTR <= RECORDS(DIRTBL)-COUNT ! IF THERE ARE MORE ENTRIES
SCR:LD = '<25>'
SCR:RD = '<25>'
. ! END IF PTR >= RECORDS(DIRTBL)-COUNT+1 ! ON THE LAST PAGE