1 // ----------------------------------------------------------------------------
2 // contest.cxx
3 //
4 // Copyright (C) 2006-2010
5 //		Dave Freese, W1HKJ
6 // Copyright (C) 2008-2009
7 //		Stelios Bounanos, M0GLD
8 //
9 // This file is part of fldigi.
10 //
11 // Fldigi is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // Fldigi is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with fldigi.  If not, see <http://www.gnu.org/licenses/>.
23 // ----------------------------------------------------------------------------
24 
25 #include <iostream>
26 
27 #include <FL/Fl.H>
28 
29 #include "fl_digi.h"
30 #include "confdialog.h"
31 
32 #include "contest.h"
33 #include "icons.h"
34 #include "dxcc.h"
35 #include "strutil.h"
36 
37 static std::string SECTIONS = "\
38 DX  \
39 CT  RI  EMA VT  ME  WMA NH  \
40 ENY NNY NLI SNJ NNJ WHY \
41 DE  MDC EPA WPA \
42 AL  GA  KY  NC  NFL PR  SC  SFL TN  VA  \
43 VI  WCF AR  LA  MS  NM  NTX OK  STX WTX \
44 EB  LAX ORG PAC SB  SCV SDG SF  SJV SV  \
45 AK  AZ  EWA ID  MT  NV  OR  UT  WWA WY  \
46 MI  OH  WV  \
47 IL  IN  WI  \
48 CO  IA  KS  MN  MO  ND  NE  SD  \
49 AB  BC  GTA MAR MB  NL  NT  ONE ONN ONS QC  SK  ";
50 
51 static std::string STATES = "\
52 DX  CT  MA  ME  NH  RI  VT  \
53 NY  NJ  \
54 DE  PA  MD  DC \
55 AL  FL  GA  KY  NC  SC  TN  VA  \
56 AR  LA  MS  NM  OK  TX  \
57 CA  HI  \
58 AK  AZ  ID  MT  NV  OR  UT  WA  WY  \
59 MI  OH  WV  \
60 IL  WI  IN  \
61 CO  IA  KS  MN  MO  ND  NE  SD  ";
62 
63 static std::string PROVINCES = "\
64 AB  BC  LB  MB  NB  NF  NS  NU  NWT ON  PEI QC  SK  YT  ";
65 
66 static std::string MEXICO = "\
67 XE1 XE2 XE3 XF1 XF4 ";
68 
69 static std::string IT1_ = "AL AT BI CN GE IM NO SP SV TO VB VC ";
70 static std::string IX1_ = "AO ";
71 static std::string IT2_ = "BG BS CO CR LC LO MB MI MN PV SO VA ";
72 static std::string IT3_ = "BL PD RO TV VE VI VR ";
73 static std::string IN3_ = "BZ TN ";
74 static std::string IV3_ = "GO PN TS UD ";
75 static std::string IT4_ = "BO FC FE MO PC PR RA RE RN ";
76 static std::string IT5_ = "AR FI GR LI LU MS PI PO PT SI ";
77 static std::string IT6_ = "AN AP AQ CH FM MC PE PS PU TE ";
78 static std::string IT7_ = "BA BR BT FG LE MT TA ";
79 static std::string IT8_ = "AV BN CB CE CS CZ IS KR NA PZ RC SA VV ";
80 static std::string IT0_ = "FR LT PG RI RM TR VT ";
81 static std::string IT9_ = "AG CL CT EN ME PA RG SR TP ";
82 static std::string IS0_ = "CA NU OR SS SU ";
83 
84 static const std::vector<dxcc*>* dxcc_list;
85 std::string country_match = "";
86 
class_test(std::string s)87 bool class_test(std::string s)
88 {
89 	if (s.length() < 2) return false;
90 	static std::string clss = "ABCDEF";
91 	if (clss.find(toupper(s[s.length()-1])) == std::string::npos)
92 		return false;
93 	for (size_t n = 0; n < s.length() - 1; n++)
94 		if (s[n] < '0' || s[n] > '9') return false;
95 	return true;
96 }
97 
state_test(std::string s)98 bool state_test(std::string s)
99 {
100 	if (s.empty()) return false;
101 	while (s.length() < 4) s.append(" ");
102 	bool isState = (STATES.find(ucasestr(s)) != std::string::npos);
103 	return isState;
104 }
105 
county_test(std::string st,std::string cty)106 bool county_test(std::string st, std::string cty)
107 {
108 	if (st.empty() && !progdefaults.SQSOinstate)
109 		st = QSOparties.qso_parties[progdefaults.SQSOcontest].state;
110 	if (!state_test(st))
111 		return false;
112 	return states.valid_county( st, cty );
113 }
114 
province_test(std::string s)115 bool province_test(std::string s)
116 {
117 	while (s.length() < 4) s.append(" ");
118 	return (PROVINCES.find(ucasestr(s)) != std::string::npos);
119 }
120 
district_test(std::string pr,std::string dist)121 bool district_test(std::string pr, std::string dist)
122 {
123 	if (pr.empty() && !progdefaults.SQSOinstate)
124 		pr = QSOparties.qso_parties[progdefaults.SQSOcontest].state;
125 	if (!province_test(pr))
126 		return false;
127 	return states.valid_county( pr, dist );
128 }
129 
check_test(std::string s)130 bool check_test(std::string s)
131 {
132 	if (s.length() < 4) {
133 		while (s.length() < 4) s.append(" ");
134 		std::string CHECK = std::string(STATES).append(PROVINCES).append(MEXICO);
135 		return (CHECK.find(s) != std::string::npos);
136 	} else
137 		return false;
138 }
139 
country_test(std::string s)140 bool country_test(std::string s)
141 {
142 	std::string str = ucasestr(s);
143 	dxcc_list = dxcc_entity_list();
144 	if (!dxcc_list) return true;
145 	for (std::vector<dxcc*>::const_iterator i = dxcc_list->begin(); i != dxcc_list->end(); ++i) {
146 		if (ucasestr((*i)->country).find(str) != std::string::npos) {
147 			country_match = (*i)->country;
148 			return true;
149 		}
150 	}
151 	country_match.clear();
152 	return false;
153 }
154 
wfd_class_test(std::string s)155 bool wfd_class_test(std::string s)
156 {
157 	if (s.length() < 2) return false;
158 	static std::string clss = "IOH";
159 	if (clss.find(toupper(s[s.length()-1])) == std::string::npos)
160 		return false;
161 	for (size_t n = 0; n < s.length() - 1; n++)
162 		if (s[n] < '0' || s[n] > '9') return false;
163 	return true;
164 }
165 
ascr_class_test(std::string s)166 bool ascr_class_test(std::string s)
167 {
168 	if (s.length() != 1) return false;
169 	if (toupper(s[0]) == 'I' ||
170 		toupper(s[0]) == 'C' ||
171 		toupper(s[0]) == 'S') return true;
172 	return false;
173 }
174 
section_test(std::string s)175 bool section_test(std::string s)
176 {
177 	while (s.length() < 4) s.append(" ");
178 	return (SECTIONS.find(s) != std::string::npos);
179 }
180 
rookie_test(std::string s)181 bool rookie_test(std::string s)
182 {
183 	int year_licensed = 0;
184 	if (!sscanf(s.c_str(), "%d", &year_licensed))
185 		return false;
186 	if (year_licensed < 100) year_licensed += 2000;
187 	int year_worked = 0;
188 	std::string s_year = std::string(zdate()).substr(0,4);
189 	sscanf(s_year.c_str(), "%d", &year_worked);
190 	if (year_worked < year_licensed) year_licensed -= 100;
191 	if (year_worked - year_licensed < 3) return true;
192 	return false;
193 }
194 
c1010_test(std::string s)195 bool c1010_test(std::string s)
196 {
197 	for (size_t n = 0; n < s.length(); n++)
198 		if (s[n] < '0' || s[n] > '9') return false;
199 	return true;
200 }
201 
202 static std::string nbrs0 = "1234567890";
203 static std::string nbrs1 = "12345";
204 static std::string nbrs2 = "123456789Nn";
205 static std::string nbrs3 = "1234567890NnTt";
206 
cut_to_numeric(std::string s)207 std::string cut_to_numeric(std::string s)
208 {
209 	for (size_t n = 0; n < s.length(); n++) {
210 		if (s[n] == 'N' || s[n] == 'n' ) s[n] = '9';
211 		if (s[n] == 'T' || s[n] == 't' ) s[n] = '0';
212 	}
213 	return s;
214 }
215 
cut_numeric_test(std::string s)216 bool cut_numeric_test(std::string s)
217 {
218 	if (s.empty()) return false;
219 	for (size_t n = 0; n < s.length(); n++)
220 		if (nbrs3.find(s[n]) == std::string::npos) return false;
221 	return true;
222 }
223 
numeric_test(std::string s)224 bool numeric_test(std::string s)
225 {
226 	if (s.empty()) return false;
227 	for (size_t n = 0; n < s.length(); n++)
228 		if (nbrs0.find(s[n]) == std::string::npos) return false;
229 	return true;
230 }
231 
rst_test(std::string s)232 bool rst_test(std::string s)
233 {
234 	if (s.length() < 3 && active_modem->get_mode() < MODE_SSB)
235 		return false;
236 	if (s.length() < 2 || s.length() > 3) return false;
237 	if (s[0] == '0') return false;
238 	if (s.length() == 2) {
239 		if (nbrs1.find(s[0]) == std::string::npos) return false;
240 		if (nbrs2.find(s[1]) == std::string::npos) return false;
241 	} else {
242 		if (nbrs1.find(s[0]) == std::string::npos) return false;
243 		if (nbrs2.find(s[1]) == std::string::npos) return false;
244 		if (nbrs2.find(s[2]) == std::string::npos) return false;
245 	}
246 	return true;
247 }
248 
italian_test(std::string s)249 bool italian_test(std::string s)
250 {
251 	if (s.length() != 2) return false;
252 	s.append(" ");
253 	if (IT1_.find(s) != std::string::npos ||
254 		IX1_.find(s) != std::string::npos ||
255 		IT2_.find(s) != std::string::npos ||
256 		IT3_.find(s) != std::string::npos ||
257 		IN3_.find(s) != std::string::npos ||
258 		IV3_.find(s) != std::string::npos ||
259 		IT4_.find(s) != std::string::npos ||
260 		IT5_.find(s) != std::string::npos ||
261 		IT6_.find(s) != std::string::npos ||
262 		IT7_.find(s) != std::string::npos ||
263 		IT8_.find(s) != std::string::npos ||
264 		IT0_.find(s) != std::string::npos ||
265 		IT9_.find(s) != std::string::npos ||
266 		IS0_.find(s) != std::string::npos )
267 		return true;
268 	return false;
269 }
270 
ss_chk_test(std::string s)271 bool ss_chk_test(std::string s)
272 {
273 	std::string nums = "0123456789";
274 	if (nums.find(s[0]) != std::string::npos &&
275 		nums.find(s[0]) != std::string::npos)
276 		return true;
277 	return false;
278 }
279 
ss_prec_test(std::string s)280 bool ss_prec_test(std::string s)
281 {
282 	std::string prec = "QABUMS";
283 	if (prec.find(ucasestr(s)[0]) != std::string::npos)
284 		return true;
285 	return false;
286 }
287 
check_field(std::string s,CONTEST_FIELD field,std::string s2)288 int check_field(std::string s, CONTEST_FIELD field, std::string s2)
289 {
290 	switch (field) {
291 		case cSTATE:
292 			return state_test(s);
293 			break;
294 		case cVE_PROV:
295 			return province_test(s);
296 			break;
297 		case cCHECK:
298 			return check_test(s);
299 			break;
300 		case cCOUNTRY:
301 			return country_test(s);
302 			break;
303 		case cCLASS:
304 		case cFD_CLASS:
305 			return class_test(s);
306 			break;
307 		case cWFD_CLASS:
308 			return wfd_class_test(s);
309 			break;
310 		case cASCR_CLASS:
311 			return ascr_class_test(s);
312 			break;
313 		case cARRL_SECT:
314 		case cFD_SECTION:
315 			return section_test(s);
316 			break;
317 		case cROOKIE:
318 			return rookie_test(s);
319 			break;
320 		case c1010:
321 			return c1010_test(s);
322 			break;
323 		case cRST:
324 			return rst_test(s);
325 			break;
326 		case cSRX:
327 		case cNUMERIC:
328 			return numeric_test(s);
329 			break;
330 		case cITALIAN:
331 			return italian_test(s);
332 			break;
333 		case cCNTY:
334 			return county_test(s2, s);
335 			break;
336 		case cDIST:
337 			return district_test(s2, s);
338 			break;
339 		case cSS_CHK:
340 			return ss_chk_test(s);
341 			break;
342 		case cSS_PREC:
343 			return ss_prec_test(s);
344 			break;
345 		case cSS_SERNO:
346 			return numeric_test(s);
347 			break;
348 		case cSS_SEC:
349 			return section_test(s);
350 			break;
351 		case cNAME: break;
352 		case cQTH: break;
353 		case cGRIDSQUARE: break;
354 		case cXCHG1: break;
355 		case cKD_XCHG: break;
356 		case cARR_XCHG: break;
357 		case cCQZ: break;
358 		default: break;
359 	}
360 	return true;
361 }
362 
363 CONTESTS contests[] = {
364 { "No Contest", "CALL if (RSTr), if (LOCATOR), NAME, QTH" },
365 { "Generic contest", "CALL EXCHANGE" },
366 { "Africa All-Mode International", "CALL SERNO, COUNTRY, RSTr, RSTs" },
367 { "ARRL Field Day", "CALL SECTION, CLASS, RSTr, RSTs" },
368 { "ARRL International DX (cw)", "CALL COUNTRY, POWER, RSTr, RSTs" },
369 { "ARRL Jamboree on the Air", "CALL TROOP_NO, STATE / VE_PROV / COUNTRY, RSTr, RSTs, SCOUT_NAME" },
370 { "ARRL Kids Day", "CALL, NAME, AGE, QTH, COMMENT, RSTr, RSTs" },
371 { "ARRL Rookie Roundup", "CALL, NAME, CHECK, STATE / VE_PROV, RSTr, RSTs" },
372 { "ARRL RTTY Roundup", "CALL STATE, SERNO, COUNTRY, RSTr, RSTs" },
373 { "ARRL School Club Roundup", "CALL CLASS, STATE / VE_PROV, NAME, RSTr, RSTs" },
374 { "ARRL November Sweepstakes", "CALL SECTION, SERNO, PREC, CHECK, RSTr, RSTs" },
375 { "ARRL Winter FD", "CALL SECTION, CLASS, RSTr, RSTs" },
376 { "BARTG RTTY contest", "CALL NAME, SERIAL, EXCHANGE" },
377 { "CQ WPX", "CALL SERNO, COUNTRY, RSTr, RSTs" },
378 { "CQ WW DX", "CALL COUNTRY, ZONE, RSTr, RSTs" },
379 { "CQ WW DX RTTY", "CALL STATE, COUNTRY, ZONE, RSTr" },
380 { "Italian A.R.I. International DX", "CALL PR(ovince), COUNTRY, SERNO, RSTr, RSTs" },
381 { "NAQP", "CALL NAME, STATE / VE_PROV / COUNTRY" },
382 { "NA Sprint", "CALL SERNO, STATE / VE_PROV / COUNTRY, NAME, RSTr, RSTs" },
383 { "Ten Ten", "CALL 1010NR, STATE, NAME, RSTr, RSTs" },
384 { "VHF", "CALL RSTr, RSTs" },
385 //{ "Worked All Europe", "CALL SERNO, COUNTRY, RSTr, RSTs" },
386 { "State QSO parties", "" },
387 { "", "" }
388 };
389 
390 struct QSOP Ccontests::qso_parties[] = {
391 /*
392 {"QSO Party Contest",              "ST", "in",  "rRST","rST","rCY","rSER","rXCHG","rNAM","rCAT", "STCTY", "Notes"},
393 */
394 {"None selected",                  "",   "",    "",    "",   "",   "",    "",     "",     "",    "",      "CALL if (RSTr), if (LOCATOR), NAME, QTH" },
395 {"Alabama QSO Party",              "AL", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
396 {"ALQP (Out of State)",            "AL", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
397 {"Arizona QSO Party",              "AZ", "T",   "B",   "B",  "B",  "" ,   "",     "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
398 {"AZQP (Out of State)",            "AZ", "",    "B",   "B",  "B",  "" ,   "",     "",     "",    "",      "CALL RST CNTY"},
399 {"Arkansas QSO Party",             "AR", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
400 {"ARQP (Out of State)",            "AR", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
401 {"British Columbia QSO Party",     "BC", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
402 {"BCQP (Out of Province)",         "BC", "",    "B",   "B",  "B",  "",    "",     "",     "",    "",      "CALL RST CNTY"},
403 {"California QSO Party",           "CA", "T",   "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL SERNO CNTY ST/PR/CNTRY"},
404 {"CAQP (Out of State)",            "CA", "",    "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL SERNO CNTY"},
405 {"Colorado QSO Party",             "CO", "T",   "",    "B",  "B",  "",    "I",    "B",    "",    "",      "CALL NAME CNTY ST/PR/CNTRY"},
406 {"COQP (Out of State)",            "CO", "",    "",    "B",  "B",  "",    "I",    "B",    "",    "",      "CALL NAME CNTY"},
407 {"Delaware QSO Party",             "DE", "T",   "B",   "B",  "B",  "",    "",     "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
408 {"DEQP (Out of State)",            "DE", "",    "B",   "B",  "B",  "",    "",     "",     "",    "",      "CALL RST CNTY"},
409 {"Florida QSO Party",              "FL", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
410 {"FLQP (Out of State)",            "FL", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
411 {"Georgia QSO Party",              "GA", "T",   "B",   "B",  "B",  "",    "" ,    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
412 {"GAQP (Out of State)",            "GA", "",    "B",   "B",  "B",  "",    "" ,    "",     "",    "",      "CALL RST CNTY"},
413 {"Hawaii QSO Party",               "HI", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
414 {"HIQP (Out of State)",            "HI", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
415 {"Idaho QSO Party",                "ID", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
416 {"IDQP (Out of State)",            "ID", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
417 {"Illinois QSO Party",             "IL", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
418 {"ILQP (Out of State)",            "IL", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
419 {"Indiana QSO Party",              "IN", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
420 {"INQP (Out of State)",            "IN", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
421 {"Iowa QSO Party",                 "IA", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
422 {"IAQP (Out of State)",            "IA", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
423 {"Kansas QSO Party",               "KS", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
424 {"KSQP (Out of State)",            "KS", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
425 {"Kentucky QSO Party",             "KY", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
426 {"KYQP (Out of State)",            "KY", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
427 {"Louisiana QSO Party",            "LA", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
428 {"LAQP (Out of State)",            "LA", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
429 {"Maine QSO Party",                "ME", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
430 {"MEQP (Out of State)",            "ME", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
431 {"Maryland QSO Party",             "MD", "T",   "",    "B",  "B",  "",    "",     "",     "B",   "",      "CALL CAT CNTY ST/PR/CNTRY"},
432 {"MDQP (Out of State)",            "MD", "",    "",    "B",  "B",  "",    "",     "",     "B",   "",      "CALL CAT CNTY"},
433 {"Michigan QSO Party",             "MI", "T",   "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL SERNO CNTY ST/PR/CNTRY"},
434 {"MIQP (Out of State)",            "MI", "",    "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL SERNO CNTY"},
435 {"Minnesota QSO Party",            "MN", "T",   "",    "B",  "B",  "",    "I",    "B",    "",    "",      "CALL NAME CNTY ST/PR/CNTRY"},
436 {"MNQP (Out of State)",            "MN", "",    "",    "B",  "B",  "",    "I",    "B",    "",    "",      "CALL NAME CNTY"},
437 {"Missouri QSO Party",             "MO", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
438 {"MOQP (Out of State)",            "MO", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
439 {"Mississippi QSO Party",          "MS", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
440 {"MSQP (Out of State)",            "MS", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
441 {"Montana QSO Party",              "MT", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
442 {"MTQP (Out of State)",            "MT", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY"},
443 {"North Carolina QSO Party",       "NC", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL CNTY ST/PR/CNTRY"},
444 {"NCQP (Out of State)",            "NC", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL CNTY"},
445 {"Nebraska QSO Party",             "NE", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
446 {"NEQP (Out of State)",            "NE", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY"},
447 {"New Jersey QSO Party",           "NJ", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
448 {"NJQP (Out of State)",            "NJ", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
449 {"New Mexico QSO Party",           "NM", "T",   "",    "B",  "B",  "",    "I",    "B",    "",    "",      "CALL NAME CNTY ST/PR/CNTRY"},
450 {"NMQP (Out of State)",            "NM", "",    "",    "B",  "B",  "",    "I",    "B",    "",    "",      "CALL NAME CNTY"},
451 {"New York QSO Party",             "NY", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
452 {"NYQP (Out of State)",            "NY", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY"},
453 {"North Dakota QSO Party",         "ND", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
454 {"NDQP (Out of State)",            "ND", " ",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY"},
455 {"Ohio QSO Party",                 "OH", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
456 {"OHQP (Out of State)",            "OH", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY"},
457 {"Oklahoma QSO Party",             "OK", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
458 {"OKQP (Out of State)",            "OK", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY"},
459 {"Ontario QSO Party",              "ON", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
460 {"ONQP (Out of Province)",         "ON", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY"},
461 {"Pennsylvania QSO Party",         "PA", "T",   "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL SERNO CNTY ST/PR/CNTRY"},
462 {"PAQP (Out of State)",            "PA", "",    "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL SERNO CNTY"},
463 {"South Carolina QSO Party"  ,     "SC", "T",   "B",   "B",  "B",  "",    "",     "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
464 {"SCQP (Out of State)",            "SC", "",    "B",   "B",  "B",  "",    "",     "",     "",    "",      "CALL CNTY"},
465 {"South Dakota QSO Party",         "SD", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
466 {"SDQP (Out of State)",            "SD", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL CNTY"},
467 {"Tennessee QSO Party",            "TN", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
468 {"TNQP (Out of State)",            "TN", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL CNTY"},
469 {"Texas QSO Party",                "TX", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
470 {"TXQP (Out of State)",            "TX", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL CNTY"},
471 {"Vermont QSO Party",              "VT", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
472 {"VTQP (Out of State)",            "VT", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL CNTY"},
473 {"Virginia QSO Party",             "VA", "T",   "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
474 {"VAQP (Out of State)",            "VA", "",    "",    "B",  "B",  "B",   "I",    "",     "",    "",      "CALL CNTY"},
475 {"Washington Salmon Run QSO Party","WA", "T",   "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
476 {"WAQP (Out of State)",            "WA", "",    "B",   "B",  "B",  "",    "B",    "",     "",    "",      "CALL CNTY"},
477 {"Wisconsin QSO Party",            "WI", "T",   "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
478 {"WIQP (Out of State)",            "WI", "",    "B",   "B",  "B",  "",    "I",    "",     "",    "",      "CALL CNTY"},
479 {"West Virginia QSO Party",        "WV", "T",   "B",   "B",  "B",  "",    "",     "",     "",    "",      "CALL RST CNTY ST/PR/CNTRY"},
480 {"WVQP (Out of State)",            "WV", "",    "B",   "B",  "B",  "",    "",     "",     "",    "",      "CALL CNTY"},
481 {"7QP QSO Party",                  "7QP","T",   "B",   "B",  "B",  "",    "I",    "",     "",    "S",     "CALL RST [(ST COUNTY) or (STCNTY) or (DX)]"},
482 {"7QP (Out of Region)",            "7QP","",    "B",   "B",  "B",  "",    "I",    "",     "",    "S",     "CALL RST [(ST COUNTY) or (STCNTY)]"},
483 {"New England QSO Party",          "6NE","T",   "B",   "B",  "B",  "",    "I",    "",     "",    "C",     "CALL RST [(ST COUNTY) or (CNTYST) or (DX)]"},
484 {"NEQP (Out of Region)",           "6NE","",    "B",   "B",  "B",  "",    "I",    "",     "",    "C",     "CALL RST [(ST COUNTY) or (CNTYST)]"},
485 {"",  "",  "",    "",  "",  "",  "",  "",  "",  "",  "",  ""}
486 };
487 //{"Alaska QSO Party",           "AK", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
488 //{"Connecticut QSO Party",      "CT", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
489 //{"Massachusetts QSO Party",    "MA", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
490 //{"New Hampshire QSO Party",    "NH", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
491 //{"Nevada QSO Party",           "NV", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
492 //{"Oregon QSO Party",           "OR", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
493 //{"Rhode Island QSO Party",     "RI", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
494 //{"Utah QSO Party",             "UT", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
495 //{"Wyoming QSO Party",          "WY", "T",   "",    "",   "",   "",    "",     "",     "",    "",      ""},
496 
contest_names()497 std::string contest_names()
498 {
499 	std::string _names;
500 	for (size_t n = 0; n < sizeof(contests) / sizeof(*contests) - 1; n++)
501 		_names.append(contests[n].name).append("|");
502 	return _names;
503 }
504 
505 Ccontests QSOparties;
506 
names()507 const std::string Ccontests::names()
508 {
509 	std::string _names;
510 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties) - 1; n++ )
511 		_names.append(qso_parties[n].contest).append("|");
512 	return _names;
513 }
514 
notes(std::string party)515 const char *Ccontests::notes(std::string party)
516 {
517 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
518 		if (party == qso_parties[n].contest)
519 			return qso_parties[n].notes;
520 	return "";
521 }
522 
523 
rst(std::string party)524 char Ccontests::rst(std::string party)
525 {
526 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
527 		if (party == qso_parties[n].contest)
528 			return qso_parties[n].rst[0];
529 	return ' ';
530 }
531 
st(std::string party)532 char Ccontests::st(std::string party)
533 {
534 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
535 		if (party == qso_parties[n].contest)
536 			return qso_parties[n].st[0];
537 	return  ' ';
538 }
539 
cnty(std::string party)540 char Ccontests::cnty(std::string party)
541 {
542 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
543 		if (party == qso_parties[n].contest)
544 			return qso_parties[n].cnty[0];
545 	return ' ';
546 }
547 
serno(std::string party)548 char Ccontests::serno(std::string party)
549 {
550 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
551 		if (party == qso_parties[n].contest)
552 			return qso_parties[n].serno[0];
553 	return ' ';
554 }
555 
556 
xchg(std::string party)557 char Ccontests::xchg(std::string party)
558 {
559 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
560 		if (party == qso_parties[n].contest)
561 			return qso_parties[n].xchg[0];
562 	return ' ';
563 }
564 
name(std::string party)565 char Ccontests::name(std::string party)
566 {
567 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
568 		if (party == qso_parties[n].contest)
569 			return qso_parties[n].name[0];
570 	return ' ';
571 }
572 
cat(std::string party)573 char Ccontests::cat(std::string party)
574 {
575 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
576 		if (party == qso_parties[n].contest)
577 			return qso_parties[n].cat[0];
578 	return ' ';
579 }
580 
stcty(std::string party)581 char Ccontests::stcty(std::string party)
582 {
583 	for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++)
584 		if (party == qso_parties[n].contest)
585 			return qso_parties[n].stcty[0];
586 	return ' ';
587 }
588 
adjust_for_contest(void *)589 void adjust_for_contest(void *)
590 {
591 	int n = progdefaults.SQSOcontest;
592 
593 	progdefaults.SQSOinstate = false;
594 	progdefaults.SQSOlogcounty = false;
595 	progdefaults.SQSOlogstate = false;
596 	progdefaults.SQSOlogxchg = false;
597 	progdefaults.SQSOlogrst = false;
598 	progdefaults.SQSOlogname = false;
599 	progdefaults.SQSOlogserno = false;
600 	progdefaults.SQSOlogstcty = false;
601 	progdefaults.SQSOlogctyst = false;
602 	progdefaults.SQSOlogcat = false;
603 
604 	if (QSOparties.qso_parties[n].instate[0] == 'T')
605 		progdefaults.SQSOinstate = true;
606 
607 	if (progdefaults.SQSOinstate) {
608 		if (QSOparties.qso_parties[n].st[0] == 'I' || QSOparties.qso_parties[n].st[0] == 'B')
609 			progdefaults.SQSOlogstate = true;
610 		if (QSOparties.qso_parties[n].cnty[0] == 'I' || QSOparties.qso_parties[n].cnty[0] == 'B')
611 			progdefaults.SQSOlogcounty = true;
612 		if (QSOparties.qso_parties[n].xchg[0] == 'I' || QSOparties.qso_parties[n].xchg[0] == 'B')
613 			progdefaults.SQSOlogxchg = true;
614 		if (QSOparties.qso_parties[n].rst[0] == 'I' ||  QSOparties.qso_parties[n].rst[0] == 'B')
615 			progdefaults.SQSOlogrst = true;
616 		if (QSOparties.qso_parties[n].name[0] == 'I' || QSOparties.qso_parties[n].name[0] == 'B')
617 			progdefaults.SQSOlogname = true;
618 		if (QSOparties.qso_parties[n].serno[0] == 'I' || QSOparties.qso_parties[n].serno[0] == 'B')
619 			progdefaults.SQSOlogserno = true;
620 		if (QSOparties.qso_parties[n].cat[0] == 'I' || QSOparties.qso_parties[n].cat[0] == 'B')
621 			progdefaults.SQSOlogcat = true;
622 	} else {
623 		if (QSOparties.qso_parties[n].st[0] == 'O' || QSOparties.qso_parties[n].st[0] == 'B')
624 			progdefaults.SQSOlogstate = true;
625 		if (QSOparties.qso_parties[n].cnty[0] == 'O' || QSOparties.qso_parties[n].cnty[0] == 'B')
626 			progdefaults.SQSOlogcounty = true;
627 		if (QSOparties.qso_parties[n].xchg[0] == 'O' || QSOparties.qso_parties[n].xchg[0] == 'B')
628 			progdefaults.SQSOlogxchg = true;
629 		if (QSOparties.qso_parties[n].rst[0] == 'O' || QSOparties.qso_parties[n].rst[0] == 'B')
630 			progdefaults.SQSOlogrst = true;
631 		if (QSOparties.qso_parties[n].name[0] == 'O' || QSOparties.qso_parties[n].name[0] == 'B')
632 			progdefaults.SQSOlogname = true;
633 		if (QSOparties.qso_parties[n].serno[0] == 'O' || QSOparties.qso_parties[n].serno[0] == 'B')
634 			progdefaults.SQSOlogserno = true;
635 		if (QSOparties.qso_parties[n].cat[0] == 'O' || QSOparties.qso_parties[n].cat[0] == 'B')
636 			progdefaults.SQSOlogcat = true;
637 	}
638 	if (QSOparties.qso_parties[n].stcty[0] == 'S')
639 		progdefaults.SQSOlogstcty = true;
640 	if (QSOparties.qso_parties[n].stcty[0] == 'C')
641 		progdefaults.SQSOlogctyst = true;
642 
643 	update_main_title();
644 
645 //std::cout << "QSOparties.qso_parties[" << n << "]\n"
646 //		  << QSOparties.qso_parties[n].contest << std::endl
647 //		  << "instate: " << progdefaults.SQSOinstate << std::endl
648 //		  << "ST:      " << QSOparties.qso_parties[n].state << std::endl
649 //		  << "rRST:    " << QSOparties.qso_parties[n].rst << std::endl
650 //		  << "rST:     " << QSOparties.qso_parties[n].st << std::endl
651 //		  << "rCY:     " << QSOparties.qso_parties[n].cnty << std::endl
652 //		  << "rSER:    " << QSOparties.qso_parties[n].serno << std::endl
653 //		  << "rXCHG:   " << QSOparties.qso_parties[n].xchg << std::endl
654 //		  << "rNAM:    " << QSOparties.qso_parties[n].name << std::endl
655 //		  << "rCAT:    " << QSOparties.qso_parties[n].cat << std::endl
656 //		  << "STCTY:   " << QSOparties.qso_parties[n].stcty << std::endl
657 //		  << "Notes:   " << QSOparties.qso_parties[n].notes << std::endl;
658 
659 }
660 
661