static gint packet_search_tree(const gchar *pbm_line, gchar *pbm_country, gchar *pbm_prefix); static void insert_tree(gint qnum, gint icc); static void search_px_tree(gint qnum); static gint packet_search_px_tree(gint ipci, const gchar *call_px); static void insert_px_tree(gint qnum); static void update_call_library(gint qnum); static void remove_old_entries(void); static guint check_for_dupe(gint qnum, gint icc, gpointer da); static gint check_for_mult(gint qnum, gint rstrt); static void new_mult_message(gpointer da); static void new_mult_sound(void); static void fill_cr_array_dt(gint qnum); static void fill_cr_array_pts(gint qnum); static void fill_cr_array_px(gint qnum, const gchar *call_px); static void fill_empty_fields(void); static void increment_totals(gint iqnum); static void reset_arrays(void); static void search_tree(gint qnum, gint icc) { gint i, cval, mid, high; gint low=1; call_tree.mbmatch = FALSE; high = icc; while(low<=high) { mid = (low+high+1)/2; cval = strcmp(cr_array[qnum].call, cr_array[call_tree.sort_order[mid]].call); if(cval<0) high = mid-1; else if(cval>0) low = mid+1; else { low = mid; for(i=mid-1; i>0; i--) { cval = strcmp(cr_array[qnum].call, cr_array[call_tree.sort_order[i]].call); if(cval) break; else low--; } call_tree.clow = low; high = mid; for(i=mid+1; i<=icc; i++) { cval = strcmp(cr_array[qnum].call, cr_array[call_tree.sort_order[i]].call); if(cval) break; else high++; } call_tree.chigh = high; mid = low; for(i=low; i<=high; i++) { cval = cr_array[qnum].mode*6+cr_array[qnum].iband- (cr_array[call_tree.sort_order[i]].mode*6+ cr_array[call_tree.sort_order[i]].iband); if(cval<0) break; else if(cval>0) mid++; else { call_tree.mbmatch = TRUE; break; } } call_tree.cmatch = mid; return; /* found */ } } call_tree.cmatch = -(low+high+1)/2; call_tree.clow = call_tree.cmatch; call_tree.chigh = call_tree.cmatch; } static gint packet_search_tree(const gchar *pbm_line, gchar *pbm_rec_county, gchar *pbm_prefix) { gint i, cval, mid, high; gchar call_line[14]; gint mbmatch=FALSE, cmatch=FALSE, idupe=FALSE; gint low=1; concat(call_line, pbm_line, 8, strlen(pbm_line)-1, COPY); strcpy(pbm_rec_county, ""); strcpy(pbm_prefix, ""); high = icall_count; while(low<=high) { mid = (low+high+1)/2; cval = strcmp(call_line, cr_array[call_tree.sort_order[mid]].call); if(cval<0) high = mid-1; else if(cval>0) low = mid+1; else { low = mid; for(i=mid-1; i>0; i--) { cval = strcmp(call_line, cr_array[call_tree.sort_order[i]].call); if(cval) break; else low--; } high = mid; for(i=mid+1; i<=icall_count; i++) { cval = strcmp(call_line, cr_array[call_tree.sort_order[i]].call); if(cval) break; else high++; } mid = low; for(i=low; i<=high; i++) { cval = mode*6+packet_band- (cr_array[call_tree.sort_order[i]].mode*6+ cr_array[call_tree.sort_order[i]].iband); if(cval<0) break; else if(cval>0) mid++; else { mbmatch = TRUE; break; } } cmatch = TRUE; strcpy(pbm_rec_county, cr_array[call_tree.sort_order[low]].rec_county); strcpy(pbm_prefix, cr_array[call_tree.sort_order[low]].prefix); break; /* found */ } } switch (isel_contest) { case DX : case WPX : case FD : case CQP : case WW : case TEN : if(mbmatch) idupe = TRUE; break; case SS : case A160 : if(cmatch) idupe = TRUE; break; } return idupe; } static void insert_tree(gint qnum, gint icc) { gint i; call_tree.cmatch = abs(call_tree.cmatch); call_tree.clow = abs(call_tree.clow); call_tree.chigh = abs(call_tree.chigh); for(i=icc; i>=call_tree.cmatch; i--) call_tree.sort_order[i+1] = call_tree.sort_order[i]; call_tree.sort_order[call_tree.cmatch] = qnum; } static void search_px_tree(gint qnum) { gint cval, mid, high; gint low=1; high = px_tree.npx; while(low<=high) { mid = (low+high+1)/2; cval = strcmp(cr_array[qnum].prefix, px_tree.px_array[mid]); if(cval<0) high = mid-1; else if(cval>0) low = mid+1; else { px_tree.pmatch = mid; return; } } px_tree.pmatch = -(low+high+1)/2; } static gint packet_search_px_tree(gint ipci, const gchar *call_px) { gint cval, mid, high; gchar call_hold[14], px_hold[6]; gint low=1, i=0, ipx=-1, new_px=TRUE; while(call_px[i]) { if(isdigit(call_px[i])) ipx = i; i++; } if(!ipx) { ipx = strlen(call_px); ipx = ipx<5 ? ipx-1 : 3; concat(px_hold, call_px, 0, ipx, COPY); strcat(px_hold, "0"); } else if(ipx<0) { ipx = strlen(call_px)<2 ? 0 : 1; concat(px_hold, call_px, 0, ipx, COPY); strcat(px_hold, "0"); } else { if(ipx>4) ipx = 4; if(ipx==2 && strlen(countries.country_abv[ipci])==4) { switch (call_px[0]) { case 'A' : case 'K' : case 'W' : strcpy(call_hold, call_px); call_hold[0] = 'K'; if(!kb_index (call_hold, countries.country_abv[ipci])) ipx = 3; break; default : if(!kb_index (call_px, countries.country_abv[ipci])) ipx = 3; } } concat(px_hold, call_px, 0, ipx, COPY); } high = px_tree.npx; while(low<=high) { mid = (low+high+1)/2; cval = strcmp(px_hold, px_tree.px_array[mid]); if(cval<0) high = mid-1; else if(cval>0) low = mid+1; else { new_px = FALSE; break; } } return new_px; } static void insert_px_tree(gint qnum) { gint i; px_tree.pmatch = abs(px_tree.pmatch); for(i=px_tree.npx; i>=px_tree.pmatch; i--) strcpy(px_tree.px_array[i+1], px_tree.px_array[i]); strcpy(px_tree.px_array[px_tree.pmatch], cr_array[qnum].prefix); px_tree.npx++; } static void update_call_library(gint qnum) { gint i, cval, mid, high, cmatch; gchar year[5], zone[3]; gint low=0, no_match=TRUE; high = clib.number_of_calls-1; while(low<=high) { mid = (low+high+1)/2; cval = strcmp(cr_array[qnum].call, clib.call[mid]); if(cval<0) high = mid-1; else if(cval>0) low = mid+1; else { cmatch = mid; no_match = FALSE; break; } } if(no_match) cmatch = -(low+high+1)/2; if(no_match && clib.number_of_calls<9998) { cmatch = abs(cmatch); for(i=clib.number_of_calls-1; i>=cmatch; i--) { strcpy(clib.call[i+1], clib.call[i]); strcpy(clib.year[i+1], clib.year[i]); strcpy(clib.country[i+1], clib.country[i]); strcpy(clib.cqzone[i+1], clib.cqzone[i]); strcpy(clib.iaruzone[i+1], clib.iaruzone[i]); strcpy(clib.state[i+1], clib.state[i]); strcpy(clib.section[i+1], clib.section[i]); strcpy(clib.county[i+1], clib.county[i]); strcpy(clib.check[i+1], clib.check[i]); } strcpy(clib.call[cmatch], cr_array[qnum].call); strcpy(clib.country[cmatch], ""); strcpy(clib.cqzone[cmatch], ""); strcpy(clib.iaruzone[cmatch], ""); strcpy(clib.state[cmatch], ""); strcpy(clib.section[cmatch], ""); strcpy(clib.county[cmatch], ""); strcpy(clib.check[cmatch], ""); clib.number_of_calls++; } strcpy(year, "20"); concat(year, cr_array[qnum].date, 4, 5, !COPY); strcpy(clib.year[cmatch], year); switch (isel_contest) { case DX : break; case WPX: if(!strcmp(cr_array[qnum].rec_county, "W") || !strcmp(cr_array[qnum].rec_county, "VE")) strcpy(clib.country[cmatch], cr_array[qnum].rec_county); break; case FD: if(strcmp(cr_array[qnum].rec_county, "DX")) strcpy(clib.section[cmatch], cr_array[qnum].rec_county); break; case CQP : strcpy(clib.country[cmatch], "W"); strcpy(clib.cqzone[cmatch], "03"); strcpy(clib.county[cmatch], cr_array[qnum].rec_county); break; case WW: if(!strcmp(cr_array[qnum].rec_county, "W") || !strcmp(cr_array[qnum].rec_county, "VE")) { strcpy(clib.country[cmatch], cr_array[qnum].rec_county); concat(zone, cr_array[qnum].rec_num, 3-mode, 4-mode, COPY); strcpy(clib.cqzone[cmatch], zone); } break; case SS : strcpy(clib.section[cmatch], cr_array[qnum].rec_county); strcpy(clib.check[cmatch], cr_array[qnum].prefix); break; case A160 : for(i=1; i<=loci.number_of_loci; i++) if(!strcmp(cr_array[qnum].rec_county, loci.locus_abv[i])) { strcpy(clib.section[cmatch], cr_array[qnum].rec_county); break; } break; case TEN : for(i=1; i<=loci.number_of_loci; i++) if(!strcmp(cr_array[qnum].rec_county, loci.locus_abv[i])) { strcpy(clib.state[cmatch], cr_array[qnum].rec_county); break; } break; } } static void remove_old_entries(void) { gint i, j, fy; fy = atoi(full_year); for(i=0; iatoi(clib.year[i])+4) { for(j=i; j0) idupe = TRUE; break; } if(!strcmp(cr_array[qnum].call, "NOQSO")) idupe = TRUE; if(idupe) { if(!strcmp(set_screen_choices[1], "")) { idt_lsave = idisplay_type; idisplay_type = IDT_INFO6; ireset_display = FALSE; update_display (da, REDRAW); play_bells (DUPE_SOUND); strcpy(msg, cr_array[qnum].call); strcat(msg, " has already been worked. Work again? (Y/N)"); answer = boxed_message (msg, 0, YELLOW); if(idt_lsave!=IDT_INFO6) { idisplay_type = idt_lsave; update_display (da, REDRAW); } } else answer = 'Y'; } return answer; } static gint check_for_mult(gint qnum, gint rstrt) { gint i, mb, mbl, mbu, new_mult; gchar call_px[14]; new_mult = 0; switch (isel_contest) { case FD : mb = 6*cr_array[qnum].mode+cr_array[qnum].iband; mbl = mbu = mb; break; case A160 : case TEN : mb = cr_array[qnum].mode; mbl = mbu = mb; break; case CQP : case SS : mb = cr_array[qnum].iband; mbl = 0; mbu = 5; break; default : mb = cr_array[qnum].iband; mbl = mbu = mb; } if(((atol(cr_array[qnum].rec_num)>atoi(fnn_char[cr_array[qnum].mode])) && (isel_contest!=FD && isel_contest!=SS)) || isel_contest==WW) { if(rstrt) { countries.icountry_index = get_country_index (qnum); if(isel_contest==WW) countries.izone_index = get_zone_index (qnum); } else { if(!(isel_contest==WW && cbv.item==FT_RN)) { get_worked_country (qnum, call_px); if(countries.icountry_index==-1) get_country (qnum, call_px); } strcpy(cr_array[qnum].rec_county, countries.country_abv[countries.icountry_index]); } if(!countries.icountry_worked[mb][countries.icountry_index]) { countries.icountry_worked[mb][countries.icountry_index] = 1; if(countries.icountry_index) new_mult += 1; } knowledge_index = countries.icountry_index; if(isel_contest==WW) { if(!countries.izone_worked[mb][countries.izone_index]) { countries.izone_worked[mb][countries.izone_index] = 1; if(countries.izone_index) new_mult += 2; } knowledge_zindex = countries.izone_index; } } else { new_mult = 1; if(isel_contest!=FD && isel_contest!=SS) concat(cr_array[qnum].rec_county, cr_array[qnum].rec_num, strlen(fnn_char[cr_array[qnum].mode]), strlen(cr_array[qnum].rec_num)-1, COPY); loci.locus_index = get_locus_index (qnum); if(loci.locus_index>-1) { for(i=mbl; i<=mbu; i++) { if(loci.locus_worked[i][loci.locus_index]) { new_mult = 0; break; } } } else new_mult = 0; if(new_mult) { loci.locus_worked[mb][loci.locus_index] = 1; if(!loci.locus_index) new_mult = 0; } knowledge_index = loci.locus_index+1000; } cr_array[qnum].mult[0] = new_mult%2; cr_array[qnum].mult[1] = (new_mult%4)/2; cr_array[qnum].mult[2] = (new_mult%8)/4; cr_array[qnum].mult[3] = new_mult/8; if(isel_contest==WPX) { new_mult = 0; if(!rstrt) fill_cr_array_px (qnum, call_px); strcpy(knowledge_prefix, cr_array[qnum].prefix); search_px_tree (qnum); if(px_tree.pmatch<0 && strcmp(cr_array[qnum].call, "NOQSO")) { insert_px_tree (qnum); new_mult = 1; cr_array[qnum].mult[1] = new_mult; } } return new_mult; } static void new_mult_message(gpointer da) { gint i; gchar msg[51], zn[3]; gint mult_num=0; const gchar *mult_messages[6] = {"New Mult! ", "Single Mult! ", "Double Mult! ", "Triple Mult! ", "Quadruple Mult! ", "New Section! "}; if(!strcmp(set_screen_choices[4], "")) { if(isel_contest==WW || isel_contest==CQP) for(i=0; i<4; i++) mult_num += cr_array[icall_count+1].mult[i]; if(isel_contest==FD) mult_num = 5; strcpy(msg, mult_messages[mult_num]); strcat(msg, cr_array[icall_count+1].call); strcat(msg, " ("); if(isel_contest==WPX) strcat(msg, cr_array[icall_count+1].prefix); else if(isel_contest==WW) { if(cr_array[icall_count+1].mult[0]) strcat(msg, cr_array[icall_count+1].rec_county); if(cr_array[icall_count+1].mult[1]) { if(cr_array[icall_count+1].mult[0]) strcat(msg, " - "); strcpy(zn, zone_chars[countries.izone_index]); left_blank_unpad (zn); strcat(msg, "Zone "); strcat(msg, zn); } } else strcat(msg, cr_array[icall_count+1].rec_county); strcat(msg, ")"); message_box (da, msg, REDRAW, CLEAR); } } static void new_mult_sound(void) { gint i; gint mult_num=0; for(i=0; i<4; i++) mult_num += cr_array[icall_count+1].mult[i]; if(isel_contest==WPX) mult_num -= cr_array[icall_count+1].mult[0]; switch (mult_num) { case 1 : play_bells (SINGLE_MULT_SOUND); break; case 2 : play_bells (DOUBLE_MULT_SOUND); break; case 3 : play_bells (DOUBLE_MULT_SOUND); play_bells (SINGLE_MULT_SOUND); break; case 4 : play_bells (DOUBLE_MULT_SOUND); play_bells (DOUBLE_MULT_SOUND); break; } } static void fill_cr_array_dt(gint qnum) { gchar *t1; t1 = asctime(&kb_time); cr_array[qnum].date[0] = month_num[2*kb_time.tm_mon]; cr_array[qnum].date[1] = month_num[2*kb_time.tm_mon+1]; cr_array[qnum].date[2] = *(t1+8); if(cr_array[qnum].date[2]==' ') cr_array[qnum].date[2] = '0'; cr_array[qnum].date[3] = *(t1+9); cr_array[qnum].date[4] = *(t1+22); cr_array[qnum].date[5] = *(t1+23); cr_array[qnum].date[6] = '\0'; cr_array[qnum].time[0] = *(t1+11); cr_array[qnum].time[1] = *(t1+12); cr_array[qnum].time[2] = *(t1+14); cr_array[qnum].time[3] = *(t1+15); cr_array[qnum].time[4] = *(t1+17); cr_array[qnum].time[5] = *(t1+18); cr_array[qnum].time[6] = '\0'; } static void fill_cr_array_pts(gint qnum) { gint lcl; if(!strcmp(cr_array[qnum].dupe, "*")) strcpy(cr_array[qnum].points, score_mb.values_char[0]); else switch (isel_contest) { case WW : if(!strcmp(countries.country_abv[countries.icountry_index], "W")) strcpy(cr_array[qnum].points, score_mb.values_char[0]); else if(countries.izone_index<9) strcpy(cr_array[qnum].points, score_mb.values_char[1]); else strcpy(cr_array[qnum].points, score_mb.values_char[2]); break; case WPX : if(!strcmp(countries.country_abv[countries.icountry_index], "W")) strcpy(cr_array[qnum].points, score_mb.values_char[1]); else if(!strcmp(countries.continent_abv[countries.icountry_index], continent_abvs[4])) strcpy(cr_array[qnum].points, score_mb.values_char[2+2*((5-cr_array[qnum].iband)/3)]); else strcpy(cr_array[qnum].points, score_mb.values_char[3+2*((5-cr_array[qnum].iband)/3)]); break; case FD : case CQP : strcpy(cr_array[qnum].points, score_mb.values_char[2-cr_array[qnum].mode]); break; case A160 : if(atol(cr_array[qnum].rec_num)>atoi(fnn_char[cr_array[qnum].mode])) strcpy(cr_array[qnum].points, score_mb.values_char[2]); else strcpy(cr_array[qnum].points, score_mb.values_char[1]); break; case TEN : lcl = strlen(cr_array[qnum].call); if(mode==CW && (kb_index (cr_array[qnum].call, "/N")==lcl-2 || kb_index (cr_array[qnum].call, "/T")==lcl-2)) strcpy(cr_array[qnum].points, score_mb.values_char[3]); else strcpy(cr_array[qnum].points, score_mb.values_char[2-cr_array[qnum].mode]); break; default : strcpy(cr_array[qnum].points, score_mb.values_char[1]); } } static void fill_cr_array_px(gint qnum, const gchar *call_px) { gint i, ipx; gchar call_hold[14]; i = 0; ipx = -1; while(call_px[i]) { if(isdigit(call_px[i])) ipx = i; i++; } if(!ipx) { ipx = strlen(call_px); ipx = ipx<5 ? ipx-1 : 3; concat(cr_array[qnum].prefix, call_px, 0, ipx, COPY); strcat(cr_array[qnum].prefix, "0"); } else if(ipx<0) { ipx = strlen(call_px)<2 ? 0 : 1; concat(cr_array[qnum].prefix, call_px, 0, ipx, COPY); strcat(cr_array[qnum].prefix, "0"); } else { if(ipx>4) ipx = 4; if(ipx==2 && strlen(countries.country_abv[countries.icountry_index])==4) { switch (call_px[0]) { case 'A' : case 'K' : case 'W' : strcpy(call_hold, call_px); call_hold[0] = 'K'; if(!kb_index (call_hold, countries.country_abv[countries.icountry_index])) ipx = 3; break; default : if(!kb_index (call_px, countries.country_abv[countries.icountry_index])) ipx = 3; } } concat(cr_array[qnum].prefix, call_px, 0, ipx, COPY); } } static void fill_empty_fields(void) { gint i, imin, qso_num, lrn; gint qso_min=10000; if(call_tree.cmatch>0) { for(i=call_tree.clow; i<=call_tree.chigh; i++) { qso_num = atoi(cr_array[call_tree.sort_order[i]].qso); if(qso_num