static bool ReadIGCDeclaration(const TCHAR *path, IGCDeclarationHeader &header, std::list<IGCDeclarationTurnpoint> &turnpoints) { // Create FileReader for reading the task FileLineReaderA reader(path); if (reader.error()) return false; // Read IGC file char *line; bool header_found = false; while ((line = reader.read()) != NULL) { // Skip lines which are not declaration records if (*line != _T('C')) continue; if (!header_found) { if (!IGCParseDeclarationHeader(line, header)) return false; header_found = true; continue; } IGCDeclarationTurnpoint tp; if (IGCParseDeclarationTurnpoint(line, tp)) turnpoints.push_back(tp); } return header_found; }
unsigned TaskFileIGC::Count() { // Open the IGC file FileLineReaderA reader(path); if (reader.error()) return 0; IGCDeclarationHeader header; // Search for declaration char *line; while ((line = reader.read()) != NULL) { if (*line != 'C') continue; if (!IGCParseDeclarationHeader(line, header) || header.num_turnpoints == 0) return 0; if (!header.task_name.empty() && !StringIsEqual(header.task_name, "Task")) { // Remember the task name StaticString<256> task_name; task_name.clear(); task_name.UnsafeAppendASCII(header.task_name.c_str()); namesuffixes.append(_tcsdup(task_name.c_str())); } return 1; } return 0; }
static void TestDeclarationHeader() { IGCDeclarationHeader header; ok1(!IGCParseDeclarationHeader("", header)); ok1(!IGCParseDeclarationHeader("C0309111642280309110001-2", header)); ok1(IGCParseDeclarationHeader("C020811084345000000000002Task", header)); ok1(header.datetime.day == 2); ok1(header.datetime.month == 8); ok1(header.datetime.year == 2011); ok1(header.datetime.hour == 8); ok1(header.datetime.minute == 43); ok1(header.datetime.second == 45); ok1(!header.flight_date.IsPlausible()); ok1(header.num_turnpoints == 2); ok1(header.task_id[0] == '0' && header.task_id[1] == '0' && header.task_id[2] == '0' && header.task_id[3] == '0'); ok1(header.task_name == "Task"); ok1(IGCParseDeclarationHeader("C210706120510210706000103", header)); ok1(header.datetime.day == 21); ok1(header.datetime.month == 7); ok1(header.datetime.year == 2006); ok1(header.datetime.hour == 12); ok1(header.datetime.minute == 5); ok1(header.datetime.second == 10); ok1(header.flight_date.day == 21); ok1(header.flight_date.month == 7); ok1(header.flight_date.year == 2006); ok1(header.num_turnpoints == 3); ok1(header.task_id[0] == '0' && header.task_id[1] == '0' && header.task_id[2] == '0' && header.task_id[3] == '1'); ok1(header.task_name.empty()); }