home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1993-08-10 | 7.4 KB | 310 lines |
- >Postcode
- "OS_GetEnv"
- env$
- env-=1
- env$,env,1)=""""
- env=0
- env=0
- 1,"Syntax: *PostCode <postcode>"
- pcode$=
- env$,env+2)
- _str1 256,_str2 256
- read_tokens
- adjust(pcode$)
- postcode(pcode$)
- error
- $;" at line ";
- adjust(
- a,b,b$
- b$=""
- i=1
- a$,i,1)
- a<>32
- "Z" a+=32
- (a>=
- "z")
- (a>=
- "9") b$+=
- $ a$=b$
- postcode(pc$)
- pc$>4
- area$=
- pc$-3)
- $local=
- pc$,3)
- area$=pc$
- !local=0
- expand(area$,!addr,!top)
- search
- expand(area$,
- offset,
- end)
- area$,1)
- 5%in=
- ("<Postcodes$Dir>.Codes."+f$)
- in=0
- 1,"No '"+f$+"' file"
- block=_str1
- "OS_GBPB",4,in,block,20
- !block<>!pcdb
- 1,"Not a PCDB file"
- block!4<>1
- 1,"Unrecognised format"
- header_len=block!8
- chunks_len=block!12
- longest_chunk=block!16
- mem=longest_chunk*2+64*1024
- block mem
- block_end=block+mem
- "OS_GBPB",4,in,block,header_len+chunks_len
- i=0
- given?i=
- area$+zs$,i+1,1)
- E ptr=0
- F pos=0
- block!ptr=!given pos=block+ptr+4
- ptr+=8
- pos<>0
- ptr>=header_len
- pos=0
- 1,"District not present"
- chunkn=!pos
- 65536
- offset=!pos
- 65536
- chunk=header_len+chunkn*4
- start =block!chunk
- P length=block!(chunk+4)-start
- end=-1
- pos+8<block+header_len
- S next_chunkn=(pos!8)
- 65536
- T next_offset=(pos!8)
- 65536
- chunkn=next_chunkn end=next_offset
- "Squash_Decompress",%1000,length
- ws_size
- ws=(block+length+32+3)
- data=ws+ws_size+32
- data+longest_chunk>block_end
- 1,"Not enough space"
- "OS_GBPB",3,in,block,length,start+20+header_len+chunks_len
- ws=(block+length+1024+3)
- data=ws+ws_size+1024
- "Squash_Decompress",%100,ws,block,length,data,block_end-data
- ,,,,last
- end=-1 end=last
- end+=data
- offset+=data
- code 2048
- last=7:this=8
- sp=13:lr=14:pc=15
- pass=0
- 2:P%=code
- [OPT pass
- .search
- STMFD sp !,{lr}
- LDR r10,addr
- LDR r12,top
- LDR last,str1
- LDR this,str2
- MOV r0,#0
- STRB r0,[last]
- STR r0,count
- .main_loop
- CMP r10,r12
- z! BGE end_of_search
- MOV r1,#0
- .find_end_of_p2
- LDRB r0,[r10,r1]
- CMP r0,#32
- ADDGE r1,r1,#1
- " BGE find_end_of_p2
- A ; r1=number of characters of p2 provided (might be 0)
- CMP r1,#0
- BEQ got_p2
- ADR r11,p2
- ADD r11,r11,#3
- < SUB r11,r11,r1 ; r11->start of given p2
- .expand_p2
- LDRB r0,[r10],#1
- STRB r0,[r11],#1
- SUBS r1,r1,#1
- BNE expand_p2
- .got_p2
- ; expand a line
- 0 ; copy any repeat from previous line
- LDRB r1,[r10],#1
- MOV r2,#0
- .copy_last
- TEQ r2,r1
- BEQ last_copied
- LDRB r0,[last,r2]
- STRB r0,[this,r2]
- ADD r2,r2,#1
- B copy_last
- .last_copied
- .copy_main
- LDRB r0,[r10],#1
- CMP r0,#&FF
-
- Q r0,#0
- STRB r0,[this,r2]
- ADDNE r2,r2,#1
- BNE copy_main
- ; i=1
- ; l=1
- in$,i,1)<>""
- ; l=
- last$,",",l+1)
- ; i=
- in$,",",i+1)
- l>0 in$+=
- last$,l)
- pc2$;" ";
- LDRB r0,[last]
- TEQ r0,#0
- # BEQ nothing_to_copy
- MOV r1,#0
- MOV r3,#0
- .find_repeat
- LDRB r0,[this,r1]
- TEQ r0,#0
- BEQ repeat_found
- .skip_to_comma1
- ADD r1,r1,#1
- LDRB r0,[this,r1]
- TEQ r0,#0
- TEQNE r0,#
- " BNE skip_to_comma1
- .skip_to_comma2
- ADD r3,r3,#1
- LDRB r0,[last,r3]
- TEQ r0,#0
- TEQNE r0,#
- " BNE skip_to_comma2
- B find_repeat
- .repeat_found
- LDRB r0,[last,r3]
- TEQ r0,#0
- # BEQ nothing_to_copy
- .copy_end
- LDRB r0,[last,r3]
- STRB r0,[this,r2]
- TEQ r0,#0
- ADDNE r2,r2,#1
- ADDNE r3,r3,#1
- BNE copy_end
- .nothing_to_copy
- LDR r0,local
- TEQ r0,#0
- BEQ show_all
- MOV r0,r0,LSL #8
- LDR r1,p2
- MOV r1,r1,LSL #8
- TEQ r0,r1
- BNE not_our_pc
- ; display the entry
- .show_all
- LDR r0,count
- ADD r0,r0,#1
- STR r0,count
- CMP r0,#1
- ! SWIGT "XOS_NewLine"
-
- MOV r1,this
- MOV r2,#32
- MOV r3,#0
- BL dump_entry
- ! SWI "XOS_NewLine"
- ADR r1,given
- BL dump_pc
- SWI 256+
- ADR r1,p2
- BL dump_pc
- ! SWI "XOS_NewLine"
- .not_our_pc
- MOV r0,last
- MOV last,this
- MOV this,r0
- ) SWI "XOS_ReadEscapeState"
- BCC main_loop
- .end_of_search
- LDMFD sp !,{pc}
- .given EQUD 0
- EQUB 0
- ALIGN
- .p2 EQUS "***"+
- .local EQUS "****"
- .addr EQUD 0
- .top EQUD 0
- .tokens EQUD _tokens
- .str1 EQUD _str1
- .str2 EQUD _str2
- .pcdb EQUS "PCDB"
- .count EQUD 0
- .dump_pc
- ;-------
- .dpc_loop
- LDRB r0,[r1],#1
- CMP r0,#32
- MOVLT pc,lr
- SUB r0,r0,#
- # CMP r0,#
- "a"+1
- SUBCC r0,r0,#32
- ADD r0,r0,#
- SWI "XOS_WriteC"
- B dpc_loop
- .dump_entry
- ;----------
- STMFD sp !,{lr}
- .dump_loop
- LDRB r0,[r1],#1
- TEQ r0,#0
- LDMEQFD sp !,{pc}
- CMP r0,#128
- BGE dump_token
- SUB lr,r0,#
- -# CMP lr,#
- "a"+1
- SUBCC r0,r0,r2
- CMP r0,#
-
- Q r0,#10
- CMPNE r0,#
- CMPNE r0,#
-
- Q r2,#32
- MOVNE r2,#0
- CMP r0,#10
- CMPEQ r0,r3
- MOV r3,r0
- BEQ dump_loop
- = SWI "XOS_WriteC"
- CMP r0,#10
- SWIEQ 256+13
- B dump_loop
- .dump_token
- LDR lr,tokens
- SUB r0,r0,#128
- STMFD sp !,{r1}
- G% LDR r1,[lr,r0,ASL #2]
- BL dump_entry
- LDMFD sp !,{r1}
- B dump_loop
- read_tokens
- "OS_File",5,"<Postcodes$Dir>.Tokens"
- ,,,,toklen
- ts toklen+32,_tokens 128*4
- T"in=
- ("<Postcodes$Dir>.Tokens")
- ptr=ts
- tptr=_tokens
- t$<>""
- t$,1)<>";"
- !tptr=ptr:tptr+=4
- $ptr=t$+
- ptr+=
- ?ptr=0
-