static AirspaceClass ParseTypeTNP(const TCHAR *buffer) { // Handle e.g. "TYPE=CLASS C" properly const TCHAR *type = StringAfterPrefixCI(buffer, _T("CLASS ")); if (type) { AirspaceClass _class = ParseClassTNP(type); if (_class != OTHER) return _class; } else { type = buffer; } for (unsigned i = 0; i < ARRAY_SIZE(airspace_tnp_type_strings); i++) if (StringIsEqualIgnoreCase(type, airspace_tnp_type_strings[i].string)) return airspace_tnp_type_strings[i].type; return OTHER; }
static bool ParseLineTNP(Airspaces &airspace_database, TCHAR *line, TempAirspaceType &temp_area, bool &ignore) { // Strip comments TCHAR *comment = _tcschr(line, _T('*')); if (comment != nullptr) *comment = _T('\0'); const TCHAR* parameter; if ((parameter = StringAfterPrefixCI(line, _T("INCLUDE="))) != nullptr) { if (StringStartsWithIgnoreCase(parameter, _T("YES"))) ignore = false; else if (StringStartsWithIgnoreCase(parameter, _T("NO"))) ignore = true; return true; } if (ignore) return true; if ((parameter = StringAfterPrefixCI(line, _T("POINT="))) != nullptr) { GeoPoint temp_point; if (!ParseCoordsTNP(parameter, temp_point)) return false; temp_area.points.push_back(temp_point); } else if ((parameter = StringAfterPrefixCI(line, _T("CIRCLE "))) != nullptr) { if (!ParseCircleTNP(parameter, temp_area)) return false; temp_area.AddCircle(airspace_database); temp_area.ResetTNP(); } else if ((parameter = StringAfterPrefixCI(line, _T("CLOCKWISE "))) != nullptr) { temp_area.rotation = 1; if (!ParseArcTNP(parameter, temp_area)) return false; } else if ((parameter = StringAfterPrefixCI(line, _T("ANTI-CLOCKWISE "))) != nullptr) { temp_area.rotation = -1; if (!ParseArcTNP(parameter, temp_area)) return false; } else if ((parameter = StringAfterPrefixCI(line, _T("TITLE="))) != nullptr) { temp_area.AddPolygon(airspace_database); temp_area.ResetTNP(); temp_area.name = parameter; } else if ((parameter = StringAfterPrefixCI(line, _T("TYPE="))) != nullptr) { temp_area.AddPolygon(airspace_database); temp_area.ResetTNP(); temp_area.type = ParseTypeTNP(parameter); } else if ((parameter = StringAfterPrefixCI(line, _T("CLASS="))) != nullptr) { temp_area.type = ParseClassTNP(parameter); } else if ((parameter = StringAfterPrefixCI(line, _T("TOPS="))) != nullptr) { ReadAltitude(parameter, temp_area.top); } else if ((parameter = StringAfterPrefixCI(line, _T("BASE="))) != nullptr) { ReadAltitude(parameter, temp_area.base); } else if ((parameter = StringAfterPrefixCI(line, _T("RADIO="))) != nullptr) { temp_area.radio = parameter; } else if ((parameter = StringAfterPrefixCI(line, _T("ACTIVE="))) != nullptr) { if (StringIsEqualIgnoreCase(parameter, _T("WEEKEND"))) temp_area.days_of_operation.SetWeekend(); else if (StringIsEqualIgnoreCase(parameter, _T("WEEKDAY"))) temp_area.days_of_operation.SetWeekdays(); else if (StringIsEqualIgnoreCase(parameter, _T("EVERYDAY"))) temp_area.days_of_operation.SetAll(); } return true; }
static bool ParseLineTNP(Airspaces &airspace_database, const TCHAR *line, TempAirspaceType &temp_area, bool &ignore) { const TCHAR* parameter; if ((parameter = string_after_prefix_ci(line, _T("INCLUDE="))) != NULL) { if (_tcsicmp(parameter, _T("YES")) == 0) ignore = false; else if (_tcsicmp(parameter, _T("NO")) == 0) ignore = true; return true; } if (ignore) return true; if ((parameter = string_after_prefix_ci(line, _T("TITLE="))) != NULL) { temp_area.Name = parameter; } else if ((parameter = string_after_prefix_ci(line, _T("RADIO="))) != NULL) { temp_area.Radio = parameter; } else if ((parameter = string_after_prefix_ci(line, _T("ACTIVE="))) != NULL) { if (_tcsicmp(parameter, _T("WEEKEND")) == 0) temp_area.days_of_operation.set_weekend(); else if (_tcsicmp(parameter, _T("WEEKDAY")) == 0) temp_area.days_of_operation.set_weekdays(); else if (_tcsicmp(parameter, _T("EVERYDAY")) == 0) temp_area.days_of_operation.set_all(); } else if ((parameter = string_after_prefix_ci(line, _T("TYPE="))) != NULL) { if (!temp_area.Waiting) temp_area.AddPolygon(airspace_database); temp_area.reset(); temp_area.Type = ParseTypeTNP(parameter); temp_area.Waiting = false; } else if ((parameter = string_after_prefix_ci(line, _T("CLASS="))) != NULL) { if (temp_area.Type == OTHER) temp_area.Type = ParseClassTNP(parameter); } else if ((parameter = string_after_prefix_ci(line, _T("TOPS="))) != NULL) { ReadAltitude(parameter, &temp_area.Top); } else if ((parameter = string_after_prefix_ci(line, _T("BASE="))) != NULL) { ReadAltitude(parameter, &temp_area.Base); } else if ((parameter = string_after_prefix_ci(line, _T("POINT="))) != NULL) { GeoPoint TempPoint; if (!ParseCoordsTNP(parameter, TempPoint)) return false; temp_area.points.push_back(TempPoint); } else if ((parameter = string_after_prefix_ci(line, _T("CIRCLE "))) != NULL) { if (!ParseCircleTNP(parameter, temp_area)) return false; temp_area.AddCircle(airspace_database); } else if ((parameter = string_after_prefix_ci(line, _T("CLOCKWISE "))) != NULL) { temp_area.Rotation = 1; if (!ParseArcTNP(parameter, temp_area)) return false; } else if ((parameter = string_after_prefix_ci(line, _T("ANTI-CLOCKWISE "))) != NULL) { temp_area.Rotation = -1; if (!ParseArcTNP(parameter, temp_area)) return false; } return true; }