File: jtmsg.f90

package info (click to toggle)
wsjtx 2.0.0%2Brepack-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 192,624 kB
  • sloc: cpp: 1,071,838; ansic: 60,751; f90: 25,266; python: 20,318; sh: 10,636; xml: 8,148; cs: 2,121; fortran: 2,051; yacc: 472; asm: 353; makefile: 316; perl: 19
file content (131 lines) | stat: -rw-r--r-- 4,740 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
subroutine jtmsg(msg,iflag)

! Attempts to identify false decodes in JT-style messages.

! Returns iflag with sum of bits as follows:
! ------------------------------------------
!    1 Grid/Report invalid
!    2 Second callsign invalid
!    4 First callsign invalid
!    8 Very unlikely free text
!   16 Questionable free text
!    0 Message is probably OK
! ------------------------------------------

  character*22 msg,t
  character*13 w1,w2,w3,w
  character*6 bc1,bc2,bc3
  character*1 c
  logical c1ok,c2ok,c3ok,isdigit,isletter,isgrid4

! Statement functions  
  isdigit(c)=(ichar(c).ge.ichar('0')) .and. (ichar(c).le.ichar('9'))
  isletter(c)=(ichar(c).ge.ichar('A')) .and. (ichar(c).le.ichar('Z'))
  isgrid4(w)=(len_trim(w).eq.4 .and.                                        &
       ichar(w(1:1)).ge.ichar('A') .and. ichar(w(1:1)).le.ichar('R') .and.  &
       ichar(w(2:2)).ge.ichar('A') .and. ichar(w(2:2)).le.ichar('R') .and.  &
       ichar(w(3:3)).ge.ichar('0') .and. ichar(w(3:3)).le.ichar('9') .and.  &
       ichar(w(4:4)).ge.ichar('0') .and. ichar(w(4:4)).le.ichar('9'))

  t=trim(msg)                         !Temporary copy of msg
  nt=len_trim(t)

! Check for standard messages
! Insert underscore in "CQ AA " to "CQ ZZ ", "CQ nnn " to make them one word.
  if(t(1:3).eq.'CQ ' .and. isletter(t(4:4)) .and.                             &
       isletter(t(5:5)) .and. t(6:6).eq.' ') t(3:3)='_'
  if(t(1:3).eq.'CQ ' .and. isdigit(t(4:4)) .and.                              &
       isdigit(t(5:5)) .and. isdigit(t(6:6)) .and. t(7:7).eq.' ') t(3:3)='_'

! Parse first three words
  w1='             '
  w2='             '
  w3='             '
  i1=index(t,' ')
  if(i1.gt.0) w1(1:i1-1)=t(1:i1-1)
  t=t(i1+1:)
  i2=index(t,' ')
  if(i2.gt.0) w2(1:i2-1)=t(1:i2-1)
  t=t(i2+1:)
  i3=index(t,' ')
  if(i3.gt.0) w3(1:i3-1)=t(1:i3-1)

  if(w1(1:3).eq.'CQ ' .or. w1(1:3).eq.'CQ_' .or. w1(1:3).eq.'DE ' .or.   &
       w1(1:4).eq.'QRZ ') then
! CQ/DE/QRZ: Should have one good callsign in w2 and maybe a grid/rpt in w3
     call chkcall(w2,bc2,c2ok)
     iflag=0
     if(.not.c2ok) iflag=iflag+2
     if(len_trim(w3).ne.0 .and. (.not.isgrid4(w3))) iflag=iflag+1
     if(w1(1:3).eq.'DE ' .and. c2ok) iflag=0
     if(iflag.eq.0) return
  endif

! Check for two calls and maybe a grid, rpt, R+rpr, RRR, or 73
  iflag=0
  call chkcall(w1,bc1,c1ok)
  call chkcall(w2,bc2,c2ok)
  if(.not.c1ok) iflag=iflag+4
  if(.not.c2ok) iflag=iflag+2
  if(len_trim(w3).ne.0 .and. (.not.isgrid4(w3)) .and.                  &
          w3(1:1).ne.'+' .and. w3(1:1).ne.'-' .and.                      &
          w3(1:2).ne.'R+' .and. w3(1:2).ne.'R-' .and.                    &
          w3(1:3).ne.'73 ' .and. w3(1:4).ne.'RRR ') iflag=iflag+1
  call chkcall(w3,bc3,c3ok)
! Allow(?) non-standard messages of the form CQ AS OC K1JT
  if(w1(1:3).eq.'CQ_'.and.isletter(w2(1:1)).and.isletter(w2(2:2)).and.   &
     w2(3:3).eq.' '.and.c3ok) iflag=0
  if(iflag.eq.0 .or. nt.gt.13) return

! Check for plausible free text

  nc=0
  np=0
  do i=1,13
     c=msg(i:i)
     if(c.ne.' ') nc=nc+1             !Number of non-blank characters
     if(c.eq.'+') np=np+1             !Number of punctuation characters
     if(c.eq.'-') np=np+1
     if(c.eq.'.') np=np+1
     if(c.eq.'/') np=np+1
     if(c.eq.'?') np=np+1
  enddo
  nb=13-nc                            !Number of blanks
  iflag=16                             !Mark as potentially questionable
  if(nc.ge.12 .or. (nc.ge.11 .and. np.gt.0)) then
     iflag=8                           !Unlikely free text, flag it
  endif

! Save messages containing some common words
  if(msg(1:3).eq.'CQ ') iflag=0
  if(index(msg,'DE ').gt.0) iflag=0
  if(index(msg,'TU ').gt.0) iflag=0
  if(index(msg,' TU').gt.0) iflag=0
  if(index(msg,'73 ').gt.0) iflag=0
  if(index(msg,' 73').gt.0) iflag=0
  if(index(msg,'TNX').gt.0) iflag=0
  if(index(msg,'THX').gt.0) iflag=0
  if(index(msg,'EQSL').gt.0) iflag=0
  if(index(msg,'LOTW').gt.0) iflag=0
  if(index(msg,'DECOD').gt.0) iflag=0
  if(index(msg,'CHK').gt.0) iflag=0
  if(index(msg,'CLK').gt.0) iflag=0
  if(index(msg,'CLOCK').gt.0) iflag=0
  if(index(msg,'LOG').gt.0) iflag=0
  if(index(msg,'QRM').gt.0) iflag=0
  if(index(msg,'QSY').gt.0) iflag=0
  if(index(msg,'TEST').gt.0) iflag=0
  if(index(msg,'CQDX').gt.0) iflag=0
  if(index(msg,'CALL').gt.0) iflag=0
  if(index(msg,'QRZ').gt.0) iflag=0
  if(index(msg,'AUTO').gt.0) iflag=0
  if(index(msg,'PHOTO').gt.0) iflag=0
  if(index(msg,'HYBRID').gt.0) iflag=0

  if(c1ok .and. w1(1:6).eq.bc1) iflag=0
  if(c2ok .and. w2(1:6).eq.bc2) iflag=0

  if(nb.ge.4) iflag=0

  return
end subroutine jtmsg