home *** CD-ROM | disk | FTP | other *** search
- CONST MEMSTART=$600000, BLOCKSIZE=$100, FILEINFOSIZE=$20, MAGIC=$2000
- CONST HEADEROFF=2*BLOCKSIZE, BLKPTRSIZE=2, FILELEN=13
- CONST FREEOFF=HEADEROFF+BLOCKSIZE, HEADER=HEADEROFF+MEMSTART
- CONST FREEBLOCKS=FREEOFF+MEMSTART, EOFB=$FFFE, EOC=$FFFF, DEL=0, START=0
-
- ENUM BAD_CARD, NO_FREE
-
- OBJECT fileinfo
- file, next
- ENDOBJECT
-
- /* lastinfo is a block pointer with MAGIC, e.g., $213A (not $13A) */
- DEF thefiles:PTR TO fileinfo, lastfile:PTR TO fileinfo, lastinfo
-
- PROC main() HANDLE
- DEF f:PTR TO fileinfo
- getinfo()
- f:=thefiles.next
- WHILE f
- extractfile(f.file)
- f:=f.next
- ENDWHILE
- EXCEPT
- SELECT exception
- CASE BAD_CARD
- WriteF('No PCMCIA card, or not from Notepad\n')
- CASE NO_FREE
- WriteF('No more free blocks -- card is full\n')
- ENDSELECT
- ENDPROC
-
- PROC extractfile(file)
- DEF b, fh, i
- IF deleted(file)
- WriteF('Skipping deleted file\n')
- ELSE
- IF fh:=Open(name(file), NEWFILE)
- WriteF('Extracting file "\s"\n', name(file))
- b:=firstblock(file)
- i:=size(file)
- WHILE (b<>EOC) AND (b<>DEL)
- Write(fh, address(b), IF i<BLOCKSIZE THEN i ELSE BLOCKSIZE)
- i:=i-BLOCKSIZE
- b:=follow(b)
- ENDWHILE
- Close(fh)
- ELSE
- WriteF('Cannot open output file "\s"\n', name(file))
- ENDIF
- ENDIF
- ENDPROC
-
- PROC getinfo()
- DEF info, nofiles=FALSE, atend=FALSE, file
- file:=HEADER
- lastinfo:=firstblock(file)
- thefiles:=lastfile:=newfile(file)
- IF validate(file)
- file:=file+FILEINFOSIZE
- REPEAT /* for all info blocks */
- REPEAT /* for all files */
- IF blank(file)
- nofiles:=TRUE
- ELSE
- lastfile.next:=newfile(file)
- lastfile:=lastfile.next
- file:=file+FILEINFOSIZE
- IF Mod(file, BLOCKSIZE)=0 THEN atend:=TRUE
- ENDIF
- UNTIL atend OR nofiles
- IF atend
- info:=follow(lastinfo)
- IF (info<>EOC) AND (info<>DEL)
- lastinfo:=info
- file:=address(lastinfo)
- atend:=FALSE
- ELSE
- nofiles:=TRUE
- ENDIF
- ENDIF
- UNTIL nofiles
- ELSE
- Raise(BAD_CARD)
- ENDIF
- ENDPROC
-
- PROC follow(block) RETURN int(blockaddr(block))
- PROC blockaddr(block) RETURN (block-MAGIC)*BLKPTRSIZE+FREEBLOCKS
- PROC address(block) RETURN (block-MAGIC)*BLOCKSIZE+MEMSTART
-
- PROC validate(file)
- RETURN StrCmp(name(file), 'NC', 2) AND (firstblock(file)=HEADEROFF+MAGIC)
- ENDPROC
-
- PROC blank(file)
- DEF n
- FOR n:=0 TO FILEINFOSIZE-1 DO IF file[]++<>0 THEN RETURN FALSE
- ENDPROC TRUE
-
- PROC deleted(file) RETURN file[]=0
- PROC name(file) RETURN file
- PROC size(file) RETURN int(file+14)
- PROC firstblock(file) RETURN int(file+20)
- PROC int(p) RETURN p[]++ OR Shl(p[],8)
-
- PROC newfile(ptr)
- DEF p
- CopyMem([ptr, NIL]:fileinfo, p:=New(SIZEOF fileinfo), SIZEOF fileinfo)
- ENDPROC p
-