home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / general / progs / postcodes / !Postcodes_Postcode (.txt) < prev    next >
Encoding:
RISC OS BBC BASIC V Source  |  1993-08-10  |  7.4 KB  |  310 lines

  1.  >Postcode
  2.  "OS_GetEnv" 
  3.  env$
  4.  env-=1
  5. env$,env,1)="""" 
  6.  env=0
  7.  env=0 
  8.  1,"Syntax: *PostCode <postcode>"
  9. pcode$=
  10. env$,env+2)
  11.  _str1 256,_str2 256
  12. read_tokens
  13. adjust(pcode$)
  14. postcode(pcode$)
  15. error
  16. $;" at line ";
  17. adjust(
  18.  a,b,b$
  19.     b$=""
  20.  i=1 
  21. a$,i,1)
  22.  a<>32 
  23. "Z" a+=32
  24.  (a>=
  25. "z") 
  26.  (a>=
  27. "9") b$+=
  28. $    a$=b$
  29. postcode(pc$)
  30. pc$>4 
  31.  area$=
  32. pc$-3)
  33.  $local=
  34. pc$,3)
  35.  area$=pc$
  36.  !local=0
  37. expand(area$,!addr,!top)
  38.  search
  39. expand(area$,
  40.  offset,
  41.  end)
  42. area$,1)
  43. 5%in=
  44. ("<Postcodes$Dir>.Codes."+f$)
  45.  in=0 
  46.  1,"No '"+f$+"' file"
  47. block=_str1
  48.  "OS_GBPB",4,in,block,20
  49.  !block<>!pcdb 
  50.  1,"Not a PCDB file"
  51.  block!4<>1 
  52.  1,"Unrecognised format"
  53. header_len=block!8
  54. chunks_len=block!12
  55. longest_chunk=block!16
  56. mem=longest_chunk*2+64*1024
  57.  block mem
  58. block_end=block+mem
  59.  "OS_GBPB",4,in,block,header_len+chunks_len
  60.  i=0 
  61.  given?i=
  62. area$+zs$,i+1,1)
  63. E    ptr=0
  64. F    pos=0
  65.  block!ptr=!given pos=block+ptr+4 
  66.  ptr+=8
  67.  pos<>0 
  68.  ptr>=header_len
  69.  pos=0 
  70. 1,"District not present"
  71. chunkn=!pos 
  72.  65536
  73. offset=!pos 
  74.  65536
  75. chunk=header_len+chunkn*4
  76. start =block!chunk
  77. P length=block!(chunk+4)-start
  78. end=-1
  79.  pos+8<block+header_len 
  80. S  next_chunkn=(pos!8) 
  81.  65536
  82. T  next_offset=(pos!8) 
  83.  65536
  84.  chunkn=next_chunkn end=next_offset
  85.  "Squash_Decompress",%1000,length 
  86.  ws_size
  87. ws=(block+length+32+3)
  88. data=ws+ws_size+32
  89.  data+longest_chunk>block_end 
  90.  1,"Not enough space"
  91.  "OS_GBPB",3,in,block,length,start+20+header_len+chunks_len
  92. ws=(block+length+1024+3)
  93. data=ws+ws_size+1024
  94.  "Squash_Decompress",%100,ws,block,length,data,block_end-data 
  95.  ,,,,last
  96.  end=-1 end=last 
  97.  end+=data
  98. offset+=data
  99.  code 2048
  100. last=7:this=8
  101. sp=13:lr=14:pc=15
  102.  pass=0 
  103.  2:P%=code
  104. [OPT pass
  105. .search
  106.         STMFD   sp !,{lr}
  107.         LDR     r10,addr
  108.         LDR     r12,top
  109.         LDR     last,str1
  110.         LDR     this,str2
  111.         MOV     r0,#0
  112.         STRB    r0,[last]
  113.         STR     r0,count
  114. .main_loop
  115.         CMP     r10,r12
  116. z!        BGE     end_of_search
  117.         MOV     r1,#0
  118. .find_end_of_p2
  119.         LDRB    r0,[r10,r1]
  120.         CMP     r0,#32
  121.         ADDGE   r1,r1,#1
  122. "        BGE     find_end_of_p2
  123. A        ; r1=number of characters of p2 provided (might be 0)
  124.         CMP     r1,#0
  125.         BEQ     got_p2
  126.         ADR     r11,p2
  127.         ADD     r11,r11,#3
  128. <        SUB     r11,r11,r1      ; r11->start of given p2
  129. .expand_p2
  130.         LDRB    r0,[r10],#1
  131.         STRB    r0,[r11],#1
  132.         SUBS    r1,r1,#1
  133.         BNE     expand_p2
  134. .got_p2
  135.         ; expand a line
  136. 0        ; copy any repeat from previous line
  137.         LDRB    r1,[r10],#1
  138.         MOV     r2,#0
  139. .copy_last
  140.         TEQ     r2,r1
  141.         BEQ     last_copied
  142.          LDRB    r0,[last,r2]
  143.          STRB    r0,[this,r2]
  144.         ADD     r2,r2,#1
  145.         B       copy_last
  146. .last_copied
  147. .copy_main
  148.         LDRB    r0,[r10],#1
  149.         CMP     r0,#&FF
  150.         
  151. Q   r0,#0
  152.          STRB    r0,[this,r2]
  153.         ADDNE   r2,r2,#1
  154.         BNE     copy_main
  155.     ; i=1
  156.     ; l=1
  157. in$,i,1)<>"" 
  158. ;  l=
  159. last$,",",l+1)
  160. ;  i=
  161. in$,",",i+1)
  162.  l>0 in$+=
  163. last$,l)
  164. pc2$;" ";
  165.         LDRB    r0,[last]
  166.         TEQ     r0,#0
  167. #        BEQ     nothing_to_copy
  168.         MOV     r1,#0
  169.         MOV     r3,#0
  170. .find_repeat
  171.          LDRB    r0,[this,r1]
  172.         TEQ     r0,#0
  173.          BEQ     repeat_found
  174. .skip_to_comma1
  175.         ADD     r1,r1,#1
  176.          LDRB    r0,[this,r1]
  177.         TEQ     r0,#0
  178.         TEQNE   r0,#
  179. "        BNE     skip_to_comma1
  180. .skip_to_comma2
  181.         ADD     r3,r3,#1
  182.          LDRB    r0,[last,r3]
  183.         TEQ     r0,#0
  184.         TEQNE   r0,#
  185. "        BNE     skip_to_comma2
  186.         B       find_repeat
  187. .repeat_found
  188.          LDRB    r0,[last,r3]
  189.         TEQ     r0,#0
  190. #        BEQ     nothing_to_copy
  191. .copy_end
  192.          LDRB    r0,[last,r3]
  193.          STRB    r0,[this,r2]
  194.         TEQ     r0,#0
  195.         ADDNE   r2,r2,#1
  196.         ADDNE   r3,r3,#1
  197.         BNE     copy_end
  198. .nothing_to_copy
  199.         LDR     r0,local
  200.         TEQ     r0,#0
  201.         BEQ     show_all
  202.          MOV     r0,r0,LSL #8
  203.         LDR     r1,p2
  204.          MOV     r1,r1,LSL #8
  205.         TEQ     r0,r1
  206.         BNE     not_our_pc
  207.         ; display the entry
  208. .show_all
  209.         LDR     r0,count
  210.         ADD     r0,r0,#1
  211.         STR     r0,count
  212.         CMP     r0,#1
  213. !        SWIGT   "XOS_NewLine"
  214.         
  215.         MOV     r1,this
  216.         MOV     r2,#32
  217.         MOV     r3,#0
  218.         BL      dump_entry
  219. !        SWI     "XOS_NewLine"
  220.         ADR     r1,given
  221.         BL      dump_pc
  222.         SWI     256+
  223.         ADR     r1,p2
  224.         BL      dump_pc
  225. !        SWI     "XOS_NewLine"
  226. .not_our_pc
  227.         MOV     r0,last
  228.         MOV     last,this
  229.         MOV     this,r0
  230. )        SWI     "XOS_ReadEscapeState"
  231.         BCC     main_loop
  232. .end_of_search
  233.         LDMFD   sp !,{pc}
  234. .given  EQUD    0
  235.         EQUB 0
  236.         ALIGN
  237. .p2     EQUS    "***"+
  238. .local  EQUS    "****"
  239. .addr   EQUD    0
  240. .top    EQUD    0
  241. .tokens EQUD    _tokens
  242. .str1   EQUD    _str1
  243. .str2   EQUD    _str2
  244. .pcdb   EQUS    "PCDB"
  245. .count  EQUD    0
  246. .dump_pc
  247. ;-------
  248. .dpc_loop
  249.         LDRB    r0,[r1],#1
  250.         CMP     r0,#32
  251.         MOVLT   pc,lr
  252.         SUB     r0,r0,#
  253. #        CMP     r0,#
  254. "a"+1
  255.         SUBCC   r0,r0,#32
  256.         ADD     r0,r0,#
  257.          SWI     "XOS_WriteC"
  258.         B       dpc_loop
  259. .dump_entry
  260. ;----------
  261.         STMFD   sp !,{lr}
  262. .dump_loop
  263.         LDRB    r0,[r1],#1
  264.         TEQ     r0,#0
  265.         LDMEQFD sp !,{pc}
  266.         CMP     r0,#128
  267.         BGE     dump_token
  268.         SUB     lr,r0,#
  269. -#        CMP     lr,#
  270. "a"+1
  271.         SUBCC   r0,r0,r2
  272.         CMP     r0,#
  273.         
  274. Q   r0,#10
  275.         CMPNE   r0,#
  276.         CMPNE   r0,#
  277.         
  278. Q   r2,#32
  279.         MOVNE   r2,#0
  280.         CMP     r0,#10
  281.         CMPEQ   r0,r3
  282.         MOV     r3,r0
  283.         BEQ     dump_loop
  284. =         SWI     "XOS_WriteC"
  285.         CMP     r0,#10
  286.         SWIEQ   256+13
  287.         B       dump_loop
  288. .dump_token
  289.         LDR     lr,tokens
  290.         SUB     r0,r0,#128
  291.         STMFD   sp !,{r1}
  292. G%        LDR     r1,[lr,r0,ASL #2]
  293.         BL      dump_entry
  294.         LDMFD   sp !,{r1}
  295.         B       dump_loop
  296. read_tokens
  297.  "OS_File",5,"<Postcodes$Dir>.Tokens" 
  298.  ,,,,toklen
  299.  ts toklen+32,_tokens 128*4
  300. T"in=
  301. ("<Postcodes$Dir>.Tokens")
  302. ptr=ts
  303. tptr=_tokens
  304.  t$<>"" 
  305. t$,1)<>";" 
  306.   !tptr=ptr:tptr+=4
  307.   $ptr=t$+
  308.   ptr+=
  309. ?ptr=0
  310.