@@ -419,44 +419,53 @@ namespace Utils {
419419
420420 bool callsignIsValid (const String& callsign) {
421421 if (callsign == " WLNK-1" ) return true ;
422-
423- String cleanCallsign;
424- int hypenCallsignIndex = callsign.indexOf (" -" );
425- if (hypenCallsignIndex > 0 ) { // SSID Validation
426- cleanCallsign = callsign.substring (0 , hypenCallsignIndex);
427- String ssid = callsign.substring (hypenCallsignIndex + 1 );
428- if (ssid.indexOf (" -" ) != -1 || ssid.length () > 2 ) return false ;
429- if (ssid.length () == 2 && ssid[0 ] == ' 0' ) return false ;
430- for (int i = 0 ; i < ssid.length (); i++) {
431- if (!isAlphaNumeric (ssid[i])) return false ;
422+ int totalCallsignLength = callsign.length ();
423+ if (totalCallsignLength < 4 ) return false ;
424+
425+ int hyphenIndex = callsign.indexOf (" -" );
426+ int baseCallsignLength = (hyphenIndex > 0 ) ? hyphenIndex : totalCallsignLength;
427+
428+ if (hyphenIndex > 0 ) { // SSID Validation
429+ if (hyphenIndex < 4 ) return false ; // base Callsign must have at least 4 characters
430+ int ssidStart = hyphenIndex + 1 ;
431+ int ssidLength = totalCallsignLength - ssidStart;
432+ if (ssidLength == 0 || ssidLength > 2 ) return false ;
433+ if (callsign.indexOf (' -' , ssidStart) != -1 ) return false ; // avoid another "-" in ssid
434+ if (ssidLength == 2 && callsign[ssidStart] == ' 0' ) return false ; // ssid can't start with "0"
435+ for (int i = ssidStart; i < totalCallsignLength; i++) {
436+ if (!isDigit (callsign[i])) return false ;
432437 }
433- } else {
434- cleanCallsign = callsign;
435438 }
436439
437- if (cleanCallsign. length () < 4 || cleanCallsign. length () > 6 ) return false ;
440+ if (baseCallsignLength < 4 || baseCallsignLength > 6 ) return false ;
438441
439- if (cleanCallsign.length () < 6 && isAlpha (cleanCallsign[0 ]) && isDigit (cleanCallsign[1 ]) && isAlpha (cleanCallsign[2 ]) && isAlpha (cleanCallsign[3 ]) ) {
440- cleanCallsign = " " + cleanCallsign; // A0AA --> _A0AA
442+ bool padded = false ; // Callsigns with 4 characters like A0AA are padded into 5 characters for further analisis : A0AA --> _A0AA
443+ if (baseCallsignLength == 4 && isAlpha (callsign[0 ]) && isDigit (callsign[1 ]) && isAlpha (callsign[2 ]) && isAlpha (callsign[3 ])) padded = true ;
444+ char c0, c1, c2, c3;
445+ if (padded) {
446+ c0 = ' ' ;
447+ c1 = callsign[0 ];
448+ c2 = callsign[1 ];
449+ c3 = callsign[2 ];
450+ } else {
451+ c0 = callsign[0 ];
452+ c1 = callsign[1 ];
453+ c2 = callsign[2 ];
454+ c3 = callsign[3 ];
441455 }
442-
443- if (!isDigit (cleanCallsign[2 ]) || !isAlpha (cleanCallsign[3 ])) { // __0A__ must be validated
444- if (cleanCallsign[0 ] != ' R' && !isDigit (cleanCallsign[1 ]) && !isAlpha (cleanCallsign[2 ])) return false ; // to accepto R0A___
456+ if (!isDigit (c2) || !isAlpha (c3)) { // __0A__ must be validated
457+ if (c0 != ' R' && !isDigit (c1) && !isAlpha (c2)) return false ; // to accepto R0A___
445458 }
446459
447- bool isValid = false ;
448- if ((isAlphaNumeric (cleanCallsign[0 ]) || cleanCallsign[0 ] == ' ' ) && isAlpha (cleanCallsign[1 ])) {
449- isValid = true ; // AA0A (+A+A) + _A0AA (+A) + 0A0A (+A+A)
450- } else if (isAlpha (cleanCallsign[0 ]) && isDigit (cleanCallsign[1 ])) {
451- isValid = true ; // A00A (+A+A)
452- } else if (cleanCallsign[0 ] == ' R' && cleanCallsign.length () == 6 && isDigit (cleanCallsign[1 ]) && isAlpha (cleanCallsign[2 ]) && isAlpha (cleanCallsign[3 ]) && isAlpha (cleanCallsign[4 ])) {
453- isValid = true ; // R0AA (+A+A)
454- }
455- if (!isValid) return false ; // also 00__ avoided
460+ bool isValid =
461+ ((isAlphaNumeric (c0) || c0 == ' ' ) && isAlpha (c1)) || // AA0A (+A+A) + _A0AA (+A) + 0A0A (+A+A)
462+ (isAlpha (c0) && isDigit (c1)) || // A00A (+A+A)
463+ (c0 == ' R' && baseCallsignLength == 6 && isDigit (c1) && isAlpha (c2) && isAlpha (c3) && isAlpha (callsign[4 ])); // R0AA (+A+A)
464+ if (!isValid) return false ; // also 00__ avoided
456465
457- if (cleanCallsign. length () > 4 ) { // to validate ____AA
458- for (int i = 5 ; i <= cleanCallsign. length () ; i++) {
459- if (!isAlpha (cleanCallsign[i - 1 ])) return false ;
466+ if (baseCallsignLength > 4 ) { // to validate ____AA
467+ for (int i = 4 ; i < baseCallsignLength ; i++) {
468+ if (!isAlpha (callsign[i ])) return false ;
460469 }
461470 }
462471 return true ;
0 commit comments