static bool FormatDecodedMETARLine(const TCHAR *line, unsigned length, const ParsedMETAR &parsed, tstring &output) { const TCHAR *end = line + length; const TCHAR *colon = (const TCHAR *)memchr(line, _T(':'), length); if (!colon) return false; unsigned title_length = colon - line; if (title_length == 0) return false; const TCHAR *value = colon + 1; while (*value == _T(' ')) value++; unsigned value_length = end - value; if (CheckTitle(line, title_length, _T("Wind"))) { StaticString<256> buffer; if (!parsed.wind_available) { buffer.Format(_T("%s: "), _("Wind")); buffer.append(value, value_length); } else { TCHAR wind_speed_buffer[16]; FormatUserWindSpeed(parsed.wind.norm, wind_speed_buffer, ARRAY_SIZE(wind_speed_buffer)); buffer.Format(_T("%s: %.0f" DEG " %s"), _("Wind"), (double)parsed.wind.bearing.Degrees(), wind_speed_buffer); } output += buffer; output += '\n'; return true; } if (CheckTitle(line, title_length, _T("Temperature"))) { StaticString<256> buffer; if (!parsed.temperatures_available) { buffer.Format(_T("%s: "), _("Temperature")); buffer.append(value, value_length); } else { TCHAR temperature_buffer[16]; FormatUserTemperature(parsed.temperature, temperature_buffer, ARRAY_SIZE(temperature_buffer)); buffer.Format(_T("%s: %s"), _("Temperature"), temperature_buffer); } output += buffer; output += '\n'; return true; } if (CheckTitle(line, title_length, _T("Dew Point"))) { StaticString<256> buffer; if (!parsed.temperatures_available) { buffer.Format(_T("%s: "), _("Dew Point")); buffer.append(value, value_length); } else { TCHAR temperature_buffer[16]; FormatUserTemperature(parsed.dew_point, temperature_buffer, ARRAY_SIZE(temperature_buffer)); buffer.Format(_T("%s: %s"), _("Dew Point"), temperature_buffer); } output += buffer; output += '\n'; return true; } if (CheckTitle(line, title_length, _T("Pressure (altimeter)"))) { StaticString<256> buffer; if (!parsed.qnh_available) { buffer.Format(_T("%s: "), _("Pressure")); buffer.append(value, value_length); } else { TCHAR qnh_buffer[16]; FormatUserPressure(parsed.qnh, qnh_buffer, ARRAY_SIZE(qnh_buffer)); buffer.Format(_T("%s: %s"), _("Pressure"), qnh_buffer); } output += buffer; output += '\n'; return true; } if (CheckTitle(line, title_length, _T("Visibility"))) { StaticString<256> buffer; buffer.Format(_T("%s: "), _("Visibility")); if (!parsed.visibility_available) { buffer.append(value, value_length); } else { if (parsed.visibility >= 9999) buffer.AppendFormat(_("more than %s"), FormatUserDistanceSmart(10000).c_str()); else buffer += FormatUserDistanceSmart(parsed.visibility); } output += buffer; output += '\n'; return true; } if (CheckTitle(line, title_length, _T("Sky conditions"))) { StaticString<256> buffer; buffer.Format(_T("%s: "), _("Sky Conditions")); StaticString<64> _value; _value.assign(value, value_length); buffer += gettext(_value); output += buffer; output += '\n'; return true; } if (CheckTitle(line, title_length, _T("Weather"))) { StaticString<256> buffer; buffer.Format(_T("%s: "), _("Weather")); StaticString<64> _value; _value.assign(value, value_length); buffer += gettext(_value); output += buffer; output += '\n'; return true; } StaticString<64> title; title.assign(line, title_length); StaticString<256> buffer; buffer.Format(_T("%s: "), gettext(title.c_str())); buffer.append(value, value_length); output += buffer; output += '\n'; return true; }