+ # at this point we should have two or three parts
+ # if it is three parts then join the first and last parts together
+ # to get an answer
+
+ # first deal with prefix/x00xx/single letter things
+ if (@parts == 3 && length $parts[0] <= length $parts[1]) {
+ @nout = matchprefix($parts[0]);
+ if (@nout) {
+ my $s = join('/', $nout[0], $parts[2]);
+ my @try = get($s);
+ if (@try && $try[0] eq $s) {
+ dbg("got 3 part prefix: $call $s") if isdbg('prefix');
+ $misses++;
+ lru_put($call, \@try);
+ push @out, @try;
+ next;
+ }
+
+ # if the second part is a callsign and the last part is one letter
+ if (is_callsign($parts[1]) && length $parts[2] == 1) {
+ pop @parts;
+ }
+ }
+ }
+
+ # if it is a two parter
+ if (@parts == 2) {
+
+ # try it as it is as compound, taking the first part as the prefix
+ @nout = matchprefix($parts[0]);
+ if (@nout) {
+ my $s = join('/', $nout[0], $parts[1]);
+ my @try = get($s);
+ if (@try && $try[0] eq $s) {
+ dbg("got 2 part prefix: $call $s") if isdbg('prefix');
+ $misses++;
+ lru_put($call, \@try);
+ push @out, @try;
+ next;
+ }
+ }
+ }
+
+ # remove the problematic /J suffix
+ pop @parts if @parts > 1 && $parts[$#parts] eq 'J';
+
+ # single parter
+ if (@parts == 1) {
+ @nout = matchprefix($parts[0]);
+ if (@nout) {
+ dbg("got prefix: $call = $nout[0]") if isdbg('prefix');
+ $misses++;
+ lru_put($call, \@nout);
+ push @out, @nout;
+ next;
+ }
+ }
+
+ # try ALL the parts
+ my @checked;
+ my $n;
+L1: for ($n = 0; $n < @parts; $n++) {
+ my $sp = '';
+ my ($k, $i);
+ for ($i = $k = 0; $i < @parts; $i++) {
+ next if $checked[$i];
+ my $p = $parts[$i];
+ if (!$sp || length $p < length $sp) {
+ dbg("try part: $p") if isdbg('prefix');
+ $k = $i;
+ $sp = $p;
+ }
+ }
+ $checked[$k] = 1;
+ $sp =~ s/-\d+$//; # remove any SSID
+
+ # now start to resolve it from the right hand end
+ @nout = matchprefix($sp);
+
+ # try and search for it in the descriptions as
+ # a whole callsign if it has multiple parts and the output
+ # is more two long, this should catch things like
+ # FR5DX/T without having to explicitly stick it into
+ # the prefix table.
+
+ if (@nout) {
+ if (@parts > 1) {
+ $parts[$k] = $nout[0];
+ my $try = join('/', @parts);
+ my @try = get($try);
+ if (isdbg('prefix')) {
+ my $part = $try[0] || "*";
+ $part .= '*' unless $part eq '*' || $part eq $try;
+ dbg("Compound prefix: $try $part" );
+ }
+ if (@try && $try eq $try[0]) {
+ $misses++;
+ lru_put($call, \@try);
+ push @out, @try;
+ } else {
+ $misses++;
+ lru_put($call, \@nout);
+ push @out, @nout;
+ }
+ } else {
+ $misses++;
+ lru_put($call, \@nout);
+ push @out, @nout;
+ }
+ next LM;
+ }
+ }
+
+ # we are a pirate!
+ @nout = matchprefix('Q');
+ $misses++;
+ lru_put($call, \@nout);
+ push @out, @nout;