diff --git a/lib/77bit/g2 b/lib/77bit/g2 index d0f2027ee..1e2a4334f 100644 --- a/lib/77bit/g2 +++ b/lib/77bit/g2 @@ -2,4 +2,5 @@ gfortran -c ../packjt.f90 gfortran -o encode77 -fbounds-check -Wall -Wno-conversion -Wno-real-q-constant \ encode77.f90 ../deg2grid.f90 ../grid2deg.f90 ../fix_contest_msg.f90 \ ../to_contest_msg.f90 ../fmtmsg.f90 ../azdist.f90 ../geodist.f90 \ - ihashcall.f90 hash10.f90 hash12.f90 hash22.f90 packjt.o + ihashcall.f90 hash10.f90 hash12.f90 hash22.f90 save_hash_call.f90 \ + packjt.o diff --git a/lib/77bit/g8 b/lib/77bit/g8 index 2161c2bfb..2258817d3 100644 --- a/lib/77bit/g8 +++ b/lib/77bit/g8 @@ -1,2 +1,2 @@ gfortran -o test28 -fbounds-check -Wall -Wno-conversion test28.f90 pack28.f90 \ - unpack28.f90 ihashcall.f90 hash22.f90 + unpack28.f90 ihashcall.f90 hash22.f90 save_hash_call.f90 diff --git a/lib/77bit/hash10.f90 b/lib/77bit/hash10.f90 index 916e777c5..1b6f03930 100644 --- a/lib/77bit/hash10.f90 +++ b/lib/77bit/hash10.f90 @@ -1,34 +1,18 @@ -subroutine hash10(n10,c13,isave) +subroutine hash10(n10,c13) - parameter (NMAX=20) - character*13 c13,callsign(NMAX) - integer ihash(NMAX) - logical first - data first/.true./ - save first,ihash,callsign - - if(first) then - ihash=-1 - callsign=' ' - first=.false. - endif - - if(isave.ge.0) then - do i=1,NMAX - if(ihash(i).eq.n10) go to 900 !This one is already in the list - enddo - ihash(NMAX:2:-1)=ihash(NMAX-1:1:-1) - callsign(NMAX:2:-1)=callsign(NMAX-1:1:-1) - ihash(1)=n10 - callsign(1)=c13 - else - do i=1,NMAX - if(ihash(i).eq.n10) then - c13=callsign(i) - go to 900 - endif - enddo - endif + parameter (MAXHASH=20) + character*13 c13,callsign(MAXHASH) + integer ihash10(MAXHASH),ihash12(MAXHASH),ihash22(MAXHASH) + common/hashcom/ihash10,ihash12,ihash22,callsign + save /hashcom/ + + c13='<...>' + do i=1,MAXHASH + if(ihash10(i).eq.n10) then + c13=callsign(i) + go to 900 + endif + enddo 900 return end subroutine hash10 diff --git a/lib/77bit/hash12.f90 b/lib/77bit/hash12.f90 index cd20b8485..1c474424a 100644 --- a/lib/77bit/hash12.f90 +++ b/lib/77bit/hash12.f90 @@ -1,34 +1,19 @@ -subroutine hash12(n12,c13,isave) +subroutine hash12(n12,c13) - parameter (NMAX=20) - character*13 c13,callsign(NMAX) - integer ihash(NMAX) - logical first - data first/.true./ - save first,ihash,callsign + parameter (MAXHASH=20) + character*13 c13,callsign(MAXHASH) + integer ihash10(MAXHASH),ihash12(MAXHASH),ihash22(MAXHASH) + common/hashcom/ihash10,ihash12,ihash22,callsign + save /hashcom/ + + c13='<...>' + do i=1,MAXHASH + if(ihash12(i).eq.n12) then + c13=callsign(i) + go to 900 + endif + enddo - if(first) then - ihash=-1 - callsign=' ' - first=.false. - endif - - if(isave.ge.0) then - do i=1,NMAX - if(ihash(i).eq.n12) go to 900 !This one is already in the list - enddo - ihash(NMAX:2:-1)=ihash(NMAX-1:1:-1) - callsign(NMAX:2:-1)=callsign(NMAX-1:1:-1) - ihash(1)=n12 - callsign(1)=c13 - else - do i=1,NMAX - if(ihash(i).eq.n12) then - c13=callsign(i) - go to 900 - endif - enddo - endif 900 return end subroutine hash12 diff --git a/lib/77bit/hash22.f90 b/lib/77bit/hash22.f90 index 596572439..b1fdbc5c4 100644 --- a/lib/77bit/hash22.f90 +++ b/lib/77bit/hash22.f90 @@ -1,35 +1,18 @@ -subroutine hash22(n22,c13,isave) +subroutine hash22(n22,c13) - parameter (NMAX=22) - character*13 c13,callsign(NMAX) - integer ihash(NMAX) - logical first - data first/.true./ - save first,ihash,callsign - - if(first) then - ihash=-1 - callsign=' ' - first=.false. - endif - - if(isave.ge.0) then - do i=1,NMAX - if(ihash(i).eq.n22) go to 900 !This one is already in the list - enddo - ihash(NMAX:2:-1)=ihash(NMAX-1:1:-1) - callsign(NMAX:2:-1)=callsign(NMAX-1:1:-1) - ihash(1)=n22 - callsign(1)=c13 - else - c13='<...>' - do i=1,NMAX - if(ihash(i).eq.n22) then - c13=callsign(i) - go to 900 - endif - enddo - endif + parameter (MAXHASH=20) + character*13 c13,callsign(MAXHASH) + integer ihash10(MAXHASH),ihash12(MAXHASH),ihash22(MAXHASH) + common/hashcom/ihash10,ihash12,ihash22,callsign + save /hashcom/ + + c13='<...>' + do i=1,MAXHASH + if(ihash22(i).eq.n22) then + c13=callsign(i) + go to 900 + endif + enddo 900 return end subroutine hash22 diff --git a/lib/77bit/pack28.f90 b/lib/77bit/pack28.f90 index 7a87fea1d..2184ba5f4 100644 --- a/lib/77bit/pack28.f90 +++ b/lib/77bit/pack28.f90 @@ -78,8 +78,7 @@ subroutine pack28(c13,n28) endif ! Check for <...> callsign if(c13(1:1).eq.'<')then - n22=ihashcall(c13,22) - call hash22(n22,c13,1) !Save (key,value) in hash table + call save_hash_call(c13,n10,n12,n22) !Save callsign in hash table n28=NTOKENS + n22 go to 900 endif @@ -104,8 +103,7 @@ subroutine pack28(c13,n28) if(iarea.lt.2 .or. iarea.gt.3 .or. nplet.eq.0 .or. & npdig.ge.iarea-1 .or. nslet.gt.3) then ! Treat this as a nonstandard callsign: compute its 22-bit hash - n22=ihashcall(c13,22) - call hash22(n22,c13,1) !Save (key,value) in hash table + call save_hash_call(c13,n10,n12,n22) !Save callsign in hash table n28=NTOKENS + n22 go to 900 endif diff --git a/lib/77bit/pack77_01.f90 b/lib/77bit/pack77_01.f90 index 334f80f65..0a90d5c73 100644 --- a/lib/77bit/pack77_01.f90 +++ b/lib/77bit/pack77_01.f90 @@ -3,11 +3,10 @@ subroutine pack77_01(nwords,w,i3,n3,c77) ! Pack a Type 0.1 message: DXpedition mode ! Example message: "K1ABC RR73; W9XYZ -11" 28 28 10 5 - character*13 w(19),chash(20) + character*13 w(19) character*77 c77 character*6 bcall_1,bcall_2 logical ok1,ok2 - common/hashcom/ihash10(20),chash if(nwords.ne.5) go to 900 !Must have 5 words if(trim(w(2)).ne.'RR73;') go to 900 !2nd word must be "RR73;" @@ -29,8 +28,7 @@ subroutine pack77_01(nwords,w,i3,n3,c77) n3=1 call pack28(w(1),n28a) call pack28(w(3),n28b) - n10=ihashcall(w(4),10) !Get the 10-bit hash code - call hash10(n10,w(4),0) !Save this hash and its callsign + call save_hash_call(w(4),n10,n12,n22) write(c77,1010) n28a,n28b,n10,n5,n3,i3 1010 format(2b28.28,b10.10,b5.5,2b3.3) diff --git a/lib/77bit/pack77_4.f90 b/lib/77bit/pack77_4.f90 index 0f8833bd8..62d3d1d2b 100644 --- a/lib/77bit/pack77_4.f90 +++ b/lib/77bit/pack77_4.f90 @@ -30,19 +30,14 @@ subroutine pack77_4(nwords,w,i3,n3,c77) iflip=0 n12=0 c11=adjustr(call_2(1:11)) - n10=ihashcall(w(2),10) - call hash10(n10,w(2),0) !Save this hash10 and its callsign - n12=ihashcall(w(2),12) - call hash12(n12,w(2),0) !Save this hash12 and its callsign + call save_hash_call(w(2),n10,n12,n22) else if(w(1)(1:1).eq.'<') then iflip=0 - n12=ihashcall(w(1),12) - call hash12(n12,w(1),0) !Save this hash and its callsign + call save_hash_call(w(1),n10,n12,n22) c11=adjustr(call_2(1:11)) else if(w(2)(1:1).eq.'<') then iflip=1 - n12=ihashcall(w(2),12) - call hash12(n12,w(2),0) !Save this hash and its callsign + call save_hash_call(w(2),n10,n12,n22) c11=adjustr(call_1(1:11)) endif n58=0 diff --git a/lib/77bit/packjt77.f90 b/lib/77bit/packjt77.f90 index 839d0d7b8..9f1f7c84a 100644 --- a/lib/77bit/packjt77.f90 +++ b/lib/77bit/packjt77.f90 @@ -2,6 +2,7 @@ include 'hash10.f90' include 'hash12.f90' include 'hash22.f90' include 'ihashcall.f90' +include 'save_hash_call.f90' include 'pack77.f90' include 'unpack77.f90' include 'pack28.f90' diff --git a/lib/77bit/save_hash_call.f90 b/lib/77bit/save_hash_call.f90 new file mode 100644 index 000000000..c8250faf6 --- /dev/null +++ b/lib/77bit/save_hash_call.f90 @@ -0,0 +1,39 @@ +subroutine save_hash_call(c13,n10,n12,n22) + + parameter (MAXHASH=20) + character*13 c13,callsign(MAXHASH) + integer ihash10(MAXHASH),ihash12(MAXHASH),ihash22(MAXHASH) + logical first + common/hashcom/ihash10,ihash12,ihash22,callsign + save first,/hashcom/ + + + if(first) then + ihash10=-1 + ihash12=-1 + ihash22=-1 + callsign=' ' + first=.false. + endif + + n10=ihashcall(c13,10) + n12=ihashcall(c13,12) + n22=ihashcall(c13,22) + do i=1,MAXHASH + if(ihash22(i).eq.n22) go to 900 !This one is already in the table + enddo + +! New entry: move table down, making room for new one at the top + ihash10(MAXHASH:2:-1)=ihash10(MAXHASH-1:1:-1) + ihash12(MAXHASH:2:-1)=ihash12(MAXHASH-1:1:-1) + ihash22(MAXHASH:2:-1)=ihash22(MAXHASH-1:1:-1) + +! Add the new entry + callsign(MAXHASH:2:-1)=callsign(MAXHASH-1:1:-1) + ihash10(1)=n10 + ihash12(1)=n12 + ihash22(1)=n22 + callsign(1)=c13 + +900 return +end subroutine save_hash_call diff --git a/lib/77bit/unpack77.f90 b/lib/77bit/unpack77.f90 index f6c4386a8..cd905ba8c 100644 --- a/lib/77bit/unpack77.f90 +++ b/lib/77bit/unpack77.f90 @@ -54,7 +54,7 @@ subroutine unpack77(c77,msg) if(irpt.ge.0) crpt(1:1)='+' call unpack28(n28a,call_1) call unpack28(n28b,call_2) - call hash10(n10,call_3,-1) + call hash10(n10,call_3) if(call_3(1:1).eq.'<') then msg=trim(call_1)//' RR73; '//trim(call_2)//' '//trim(call_3)// & ' '//crpt @@ -213,7 +213,7 @@ subroutine unpack77(c77,msg) c11(i:i)=c(j:j) n58=n58/38 enddo - call hash12(n12,call_3,-1) + call hash12(n12,call_3) if(iflip.eq.0) then call_1=call_3 call_2=adjustl(c11)//' '