Rem Compress module Rem (c)Pelican software Inc. Rem P.o Box 741072 Rem Houston, Tx. 77274-1072 Rem (713) 773-2803 Rem This is the newest part of the Pelican Software Inc. Library REm If you find you can use it, send $15 to Pelican Software Inc. Rem To run inside another app. certain changes need to be made to this Rem procedure. Comments are in the code. The first dinit-dialog can be rem removed, since you will already have a filename. You must pass the rem global with the filename into this proc. and then (filz$=yourglobal$) Rem If you have the file open that you want to compress, you will need to Rem close it. Just remove Rem's. It's already in the code. Rem Run on data files only - not opl text or word or any other non data. app Cpress icon "M:\OPD\cpress.pic" enda proc cpress: global Media$(16),vol$(12),tot$(12),free$(12),device$(7) local d$(3,2),v&,n&,high%,l%,ext$(4) local p%,t,d%,space&,old& local filz$(130) local ver%,at%,size&,md&,sp& Rem --- dont change this order setpath "M:\dat\" Rem --- Set to your own Rem filz$+fil$ (if calling from within another proc.) beep 5,50 giprint chr$(184)+"1992 Pelican Software Inc." top:: Rem -------- Remove this code to call from within another procedure dinit"Open a File to Compress" dtext"","Data files only!",$102 dfile filz$,"Open",0 if dialog ext$=parse$:(filz$,5) if loc(".odb.dbf.dat",ext$)=0 giprint"Data files only..." goto top:: endif busy"Checking Ram Drives..." filz$=filz$+chr$(0) call($887,addr(filz$)+1,addr(ver%),0,0,0) Rem ------- Call for file attrib device$=parse$:(filz$,2) media: if media$="FLASH" busy off dinit dtext"","Compressing cant be done on Flash",$302 dtext"","There would be no benefit. To reclaim" dtext"","space on a Flash, copy all files to" dtext"","a Ram drive and Format the Flash SSD," dtext"","then compress the files on the Ram drive" dtext"","and copy the files back to the Flash SSD." dialog return elseif left$(media$,5)="WRITE" busy off dinit dtext"","Compress Failed!",$302 dtext"",media$+" Media" dbuttons "Continue",27 dialog return endif d$(1)="M:" :d$(2)="A:" :d$(3)="B:" l%=1 high%=1 n&=0 do Rem --- Get Ram Drive w/most mem device$=d$(l%) media: giprint media$+" on "+d$(l%) Rem ---- take this out if you don't want to display it. pause 10 v&=val(free$) if v&>n& and media$="RAM" high%=l% n&=v& endif l%=l%+1 until l%>3 Rem ---- d$(high%) has most memory device$=d$(high%) media: space&=val(free$) Rem ---- free space on drive busy off dinit"Compress File?" dbuttons "Yes",%Y,"No",%N d%=dialog if d%=%y or d%=%Y if size&>space&-100 Rem ---- size of file>space free dinit"Compress Cancelled" dtext"","Not enough space!",2 dtext""," " dbuttons "Continue",27 dialog return endif busy "Compressing..." rem use b Rem ---- Log of open file rem trap close n&=0 do Rem ---- get unique filename if exist(d$(high%)+"\cprss"+fix$(n&,0,3)+".odb") n&=n&+1 else break endif until 0 trap compress filz$,d$(high%)+"\cprss"+fix$(n&,0,3)+".odb" if err giprint err$(err) pause 30 busy off return endif trap delete filz$ Rem ---- dump original if parse$:(filz$,2)<>d$(high%) trap copy d$(high%)+"\cprss"+fix$(n&,0,3)+".odb",filz$ Rem ---- copy to yourglobal$, not filz$ if Rem ---- if not same drive,copy Rem ---- you are calling from other proc. if err giprint err$(err) goto done:: Rem -------- Delete file if copy was successful else trap delete d$(high%)+"\cprss"+fix$(n&,0,3)+".odb" endif else rename d$(high%)+"\cprss"+fix$(n&,0,3)+".odb",filz$ Rem ----else just rename the new file if err giprint ERR$(err) pause 30 endif endif done:: giprint"Done" beep 5,50 old&=size& call($887,addr(filz$)+1,addr(ver%),0,0,0) busy off dinit"File "+parse$:(filz$,6)+" Compressed!" dtext"Before:",fix$(old&,0,8)+" bytes" dtext"After:",fix$(size&,0,8)+" bytes" if dialog busy off goto top:: endif endif endif Endp proc Media: LOCAL t$(7,16),f% local add%(9),addr$(32) t$(1)="UNKNOWN" :T$(2)="FLOPPY" T$(3)="HARD DISK" :T$(4)="FLASH" T$(5)="RAM" :T$(6)="ROM" :T$(7)="WRITE-PROTECTED" f%=devinfo%:(device$,addr(add%(1)),addr(addr$)) if f%<0 Media$="None" :Vol$="None" :tot$="0" :free$="0" return endif Media$=T$(fldtype%:(device$)+1) Vol$= addr$ if device$<>"M:" Tot$= fix$(peekl(addr(add%(1))+6),0,8) else tot$="262144" REm ----- couldn't get M to report accurate totol mem endif Rem ----- will need to be changed if Psion comes out with an S3 with more mem. Free$=fix$(peekl(addr(add%(1))+10),0,8) return endp PROC devinfo%:(device$,pinfo%,pvol%) local exec%(10) local code% local rtn% local buffer$(64) local pbuffer% local dev$(129) local pdev% local i% code%=addr(exec%(1)) pokew code%,$0Ab4 pokew code%+2,$87cd pokew code%+4,$0272 pokew code%+6,$c033 pokeb code%+8,$cb pbuffer% = addr(buffer$) dev$ = device$+chr$(0) pdev% = addr(dev$)+1 rtn% = usr(code%,0,pdev%,pbuffer%,0) if rtn% >= 0 pokew pinfo%,peekw(pbuffer%) pokew pinfo%+2,peekw(pbuffer%+2) pokew pinfo%+4,peekw(pbuffer%+4) pokel pinfo%+6,peekl(pbuffer%+6) pokel pinfo%+10,peekl(pbuffer%+10) pokew pinfo%+14,peekw(pbuffer%+46) i%=0 while peekb(pbuffer%+14+i%)<>0 and i%<=32 pokeb pvol%+1+i%,peekb(pbuffer%+14+i%) i%=i%+1 endwh pokeb pvol%,i% endif return rtn% ENDP PROC fldtype%:(device$) local rtn% local info%(8) local vdummy$(32) rtn%=DEVINFO%:(device$,addr(info%(1)),addr(vdummy$)) if rtn% >= 0 rtn%=info%(2) and $ff endif return rtn% ENDP Rem ------ Pelican Software Inc. Library PROC parse$:(filz$,req%) local b%(6),p$(128),rel$(8),fsys$(8),dev$(2),path$(128),fn$(12),ext$(4) p$=parse$(filz$,rel$,b%()) fsys$=mid$(p$,1,b%(2)-1) dev$=mid$(p$,b%(2),b%(3)-b%(2)) path$=mid$(p$,b%(3),b%(4)-b%(3)) fn$=mid$(p$,b%(4),b%(5)-b%(4)) ext$=mid$(p$,b%(5),4) if req%=1 :Return fsys$ elseif req%=2 :return dev$ elseif req%=3 :return path$ elseif req%=4 :return fn$ elseif req%=5 :return ext$ elseif req%=6 :return fn$+ext$ rem Add your own combinations here endif ENDP