static bool ParseLine(AirspaceDatabase &airspace_database, int nLineType, unsigned &NumberOfAirspacePoints, unsigned &NumberOfAirspaceAreas, unsigned &NumberOfAirspaceCircles) { int nIndex; switch (nLineType) { case k_nLtAC: if (bFillMode) { if (!bWaiting) AddArea(airspace_database, &TempArea, NumberOfAirspaceAreas); TempArea.NumPoints = 0; TempArea.Type = OTHER; for (nIndex = 0; nIndex < k_nAreaCount; nIndex++) { if (StartsWith(&TempString[3], k_strAreaStart[nIndex])) { TempArea.Type = k_nAreaType[nIndex]; break; } } Rotation = +1; } else if (!bWaiting) // Don't count circles JG 10-Nov-2005 NumberOfAirspaceAreas++; Rotation = +1; bWaiting = false; break; case k_nLtAN: if (bFillMode) { TempString[NAME_SIZE] = '\0'; _tcscpy(TempArea.Name, &TempString[3]); } break; case k_nLtAL: if (bFillMode) ReadAltitude(&TempString[3], &TempArea.Base); break; case k_nLtAH: if (bFillMode) ReadAltitude(&TempString[3],&TempArea.Top); break; case k_nLtV: // Need to set these while in count mode, or DB/DA will crash if (StartsWith(&TempString[2], _T("X=")) || StartsWith(&TempString[2], _T("x="))) { if (ReadCoords(&TempString[4],&CenterX, &CenterY)) break; } else if (StartsWith(&TempString[2], _T("D=-")) || StartsWith(&TempString[2], _T("d=-"))) { Rotation = -1; break; } else if (StartsWith(&TempString[2], _T("D=+")) || StartsWith(&TempString[2], _T("d=+"))) { Rotation = +1; break; } else if (StartsWith(&TempString[2], _T("Z")) || StartsWith(&TempString[2], _T("z"))) { // ToDo Display Zool Level break; } else if (StartsWith(&TempString[2], _T("W")) || StartsWith(&TempString[2], _T("w"))) { // ToDo width of an airway break; } else if (StartsWith(&TempString[2], _T("T")) || StartsWith(&TempString[2], _T("t"))) { // ----- JMW THIS IS REQUIRED FOR LEGACY FILES break; } goto OnError; case k_nLtDP: /* if (bFillMode) { ReadCoords(&TempString[3],&TempPoint.Longitude , &TempPoint.Latitude ); AddPoint(&TempPoint); } else NumberOfAirspacePoints++; */ // if (bFillMode) if (!ReadCoords(&TempString[3],&TempPoint.Longitude , &TempPoint.Latitude)) goto OnError; AddPoint(airspace_database, &TempPoint, &TempArea.NumPoints, NumberOfAirspacePoints); // TempArea.NumPoints++; break; case k_nLtDB: CalculateArc(airspace_database, TempString, NumberOfAirspacePoints); break; case k_nLtDA: CalculateSector(airspace_database, TempString, NumberOfAirspacePoints); break; case k_nLtDC: if (bFillMode) { double Radius = _tcstod(&TempString[2], NULL); Radius = (Radius * NAUTICALMILESTOMETRES); AddAirspaceCircle(airspace_database, &TempArea, CenterX, CenterY, Radius, NumberOfAirspaceCircles); } else NumberOfAirspaceCircles++; bWaiting = true; break; default: break; } return(true); OnError: if (!bFillMode){ TCHAR sTmp[MAX_PATH]; _stprintf(sTmp, TEXT("%s: %d\r\n\"%s\"\r\n%s."), gettext(TEXT("Parse Error at Line")), LineCount, TempString, gettext(TEXT("Line skipped."))); if (MessageBoxX(sTmp, gettext(TEXT("Airspace")), MB_OKCANCEL) == IDCANCEL){ return(false); } } return(true); }
static bool ParseLine(Airspaces &airspace_database, const TCHAR *line, TempAirspaceType &temp_area) { const TCHAR *value; // Only return expected lines switch (line[0]) { case _T('A'): case _T('a'): switch (line[1]) { case _T('C'): case _T('c'): value = value_after_space(line + 2); if (value == NULL) break; if (!temp_area.Waiting) temp_area.AddPolygon(airspace_database); temp_area.reset(); temp_area.Type = ParseType(value); temp_area.Waiting = false; break; case _T('N'): case _T('n'): value = value_after_space(line + 2); if (value != NULL) temp_area.Name = value; break; case _T('R'): case _T('r'): value = value_after_space(line + 2); if (value != NULL) temp_area.Radio = value; break; case _T('L'): case _T('l'): value = value_after_space(line + 2); if (value != NULL) ReadAltitude(value, &temp_area.Base); break; case _T('H'): case _T('h'): value = value_after_space(line + 2); if (value != NULL) ReadAltitude(value, &temp_area.Top); break; default: return true; } break; case _T('D'): case _T('d'): switch (line[1]) { case _T('A'): case _T('a'): CalculateSector(line, temp_area); break; case _T('B'): case _T('b'): CalculateArc(line, temp_area); break; case _T('C'): case _T('c'): temp_area.Radius = Units::ToSysUnit(fixed(_tcstod(&line[2], NULL)), unNauticalMiles); temp_area.AddCircle(airspace_database); temp_area.reset(); break; case _T('P'): case _T('p'): value = value_after_space(line + 2); if (value == NULL) break; { GeoPoint TempPoint; if (!ReadCoords(value, TempPoint)) return false; temp_area.points.push_back(TempPoint); break; } default: return true; } break; case _T('V'): case _T('v'): // Need to set these while in count mode, or DB/DA will crash if (string_after_prefix_ci(&line[2], _T("X="))) { if (!ReadCoords(&line[4],temp_area.Center)) return false; } else if (string_after_prefix_ci(&line[2], _T("D=-"))) { temp_area.Rotation = -1; } else if (string_after_prefix_ci(&line[2], _T("D=+"))) { temp_area.Rotation = +1; } break; } return true; }