bool PolarGlue::LoadFromFile(PolarInfo &polar, NLineReader &reader) { const char *line; while ((line = reader.ReadLine()) != nullptr) if (ParsePolar(polar, line)) return true; return false; }
unsigned FlarmNetReader::LoadFile(NLineReader &reader, FlarmNetDatabase &database) { /* skip first line */ const char *line = reader.ReadLine(); if (line == NULL) return 0; int itemCount = 0; while ((line = reader.ReadLine()) != NULL) { FlarmNetRecord record; if (LoadRecord(record, line)) { database.Insert(record); itemCount++; } } return itemCount; }
unsigned FLARMNetDatabase::LoadFile(NLineReader &reader) { /* skip first line */ const char *line = reader.read(); if (line == NULL) return 0; int itemCount = 0; while ((line = reader.read()) != NULL) { FLARMNetRecord *record = new FLARMNetRecord; LoadRecord(line, record); insert(value_type(record->GetId(), record)); itemCount++; }; return itemCount; }
static bool ReadLine(NLineReader &reader, double &value_r) { const char *line = reader.ReadLine(); // x scale if (line == nullptr) return false; char *endptr; double value = ParseDouble(line, &endptr); if (endptr == line) return false; value_r = value; return true; }
static bool FixGRecord(NLineReader &reader, TextWriter &writer) { GRecord grecord; grecord.Initialize(); char digest[GRecord::DIGEST_LENGTH + 1]; grecord.GetDigest(digest); char *line; while ((line = reader.ReadLine()) != nullptr) { if (line[0] == 'G') break; if (memcmp(line, "HFFTYFRTYPE:XCSOAR,XCSOAR ", 26) == 0) { char *v = strstr(line + 25, " 6.5 "); if (v != nullptr) { static char buffer[1024], *p = buffer; size_t n = v + 4 - line; memcpy(p, line, n); p += n; memcpy(p, "fix", 3); p += 3; strcpy(p, v + 4); line = buffer; } } grecord.AppendRecordToBuffer(line); if (!writer.WriteLine(line)) return false; } grecord.FinalizeBuffer(); grecord.WriteTo(writer); return true; }
bool ParseFileRepository(FileRepository &repository, NLineReader &reader) { AvailableFile file; file.Clear(); char *line; while ((line = reader.ReadLine()) != NULL) { line = const_cast<char *>(TrimLeft(line)); if (*line == 0 || *line == '#') continue; const char *name = line, *value = ParseLine(line); if (value == NULL) return false; if (StringIsEqual(name, "name")) { if (!Commit(repository, file)) return false; file.name.assign(value); } else if (file.IsEmpty()) { /* ignore */ } else if (StringIsEqual(name, "uri")) { file.uri.assign(value); } else if (StringIsEqual(name, "area")) { file.area = value; } else if (StringIsEqual(name, "type")) { if (StringIsEqual(value, "airspace")) file.type = AvailableFile::Type::AIRSPACE; else if (StringIsEqual(value, "waypoint")) file.type = AvailableFile::Type::WAYPOINT; else if (StringIsEqual(value, "map")) file.type = AvailableFile::Type::MAP; else if (StringIsEqual(value, "flarmnet")) file.type = AvailableFile::Type::FLARMNET; } } return Commit(repository, file); }
void TopographyStore::Load(OperationEnvironment &operation, NLineReader &reader, const TCHAR *directory, struct zzip_dir *zdir) { Reset(); // Create buffer for the shape filenames // (shape_filename will be modified with the shape_filename_end pointer) char shape_filename[MAX_PATH]; if (directory != nullptr) { const WideToACPConverter narrow_directory(directory); strcpy(shape_filename, narrow_directory); strcat(shape_filename, DIR_SEPARATOR_S); } else shape_filename[0] = 0; char *shape_filename_end = shape_filename + strlen(shape_filename); // Read file size to have a rough progress estimate for the progress bar const long filesize = std::max(reader.GetSize(), 1l); // Set progress bar to 100 steps operation.SetProgressRange(100); // Iterate through shape files in the "topology.tpl" file until // end or max. file number reached char *line; while (!files.full() && (line = reader.ReadLine()) != nullptr) { // .tpl Line format: filename,range,icon,field,r,g,b,pen_width,label_range,important_range,alpha // Ignore comments (lines starting with *) and empty lines if (StringIsEmpty(line) || line[0] == '*') continue; // Find first comma to extract shape filename char *p = strchr(line, ','); if (p == nullptr || p == line) // If no comma was found -> ignore this line/shapefile continue; if (HasLittleMemory()) { /* hard-coded blacklist for huge files on PPC2000; those devices usually have very little memory */ // Null-terminate the line string after the first comma // for strcmp() calls in IsHugeTopographyFile() function *p = 0; // Skip large topography files if (IsHugeTopographyFile(line)) continue; } // Extract filename and append it to the shape_filename buffer memcpy(shape_filename_end, line, p - line); // Append ".shp" file extension to the shape_filename buffer strcpy(shape_filename_end + (p - line), ".shp"); // Parse shape range fixed shape_range = fixed(strtod(p + 1, &p)) * 1000; if (*p != _T(',')) continue; // Extract shape icon name char icon_name[23]; char *start = p + 1; p = strchr(start, ','); // Null-terminate the line string at the next comma for strncpy() call *p = 0; strncpy(icon_name, start, 22); ResourceId icon = ResourceId::Null(), big_icon = ResourceId::Null(); if (strlen(icon_name) > 0) { const LOOKUP_ICON *ip = icon_list; while (ip->name != nullptr) { if (StringIsEqual(ip->name, icon_name)) { icon = ip->resource_id; big_icon = ip->big_resource_id; break; } ip++; } } // Parse shape field for text display long shape_field = strtol(p + 1, &p, 10) - 1; if (*p != _T(',')) continue; // Parse red component of line / shading colour uint8_t red = (uint8_t)strtol(p + 1, &p, 10); if (*p != _T(',')) continue; // Parse green component of line / shading colour uint8_t green = (uint8_t)strtol(p + 1, &p, 10); if (*p != _T(',')) continue; // Parse blue component of line / shading colour uint8_t blue = (uint8_t)strtol(p + 1, &p, 10); // Parse pen width of lines unsigned pen_width = 1; if (*p == _T(',')) { pen_width = strtoul(p + 1, &p, 10); if (pen_width < 1) pen_width = 1; else if (pen_width>31) pen_width=31; } // Parse range for displaying labels fixed label_range = shape_range; if (*p == _T(',')) label_range = fixed(strtod(p + 1, &p)) * 1000; // Parse range for displaying labels with "important" rendering style fixed labelImportantRange = fixed(0); if (*p == _T(',')) labelImportantRange = fixed(strtod(p + 1, &p)) * 1000; // Handle alpha component // If not present at all (i.e. v6.6 or earlier file), default to 100% opaque uint8_t alpha = 255; if (*p == _T(',')) { // An alpha component of shading colour is present (v6.7 or later file). alpha = (uint8_t)strtol(p + 1, &p, 10); // Ignore a totally transparent file! if (alpha == 0) continue; #ifndef ENABLE_OPENGL // Without OpenGL ignore anything but 100% opaque if (alpha != 255) continue; #endif } // Create TopographyFile instance from parsed line TopographyFile *file = new TopographyFile(zdir, shape_filename, shape_range, label_range, labelImportantRange, #ifdef ENABLE_OPENGL Color(red, green, blue, alpha), #else Color(red, green, blue), #endif shape_field, icon, big_icon, pen_width); if (file->IsEmpty()) // If the shape file could not be read -> skip this line/file delete file; else // .. otherwise append it to our list of shape files files.append(file); // Update progress bar operation.SetProgressPosition((reader.Tell() * 100) / filesize); } }
void TopographyStore::Load(OperationEnvironment &operation, NLineReader &reader, const TCHAR *directory, struct zzip_dir *zdir) { Reset(); // Create buffer for the shape filenames // (shape_filename will be modified with the shape_filename_end pointer) char shape_filename[MAX_PATH]; if (directory != NULL) { const WideToACPConverter narrow_directory(directory); strcpy(shape_filename, narrow_directory); strcat(shape_filename, DIR_SEPARATOR_S); } else shape_filename[0] = 0; char *shape_filename_end = shape_filename + strlen(shape_filename); // Read file size to have a rough progress estimate for the progress bar long filesize = std::max(reader.size(), 1l); // Set progress bar to 100 steps operation.SetProgressRange(100); // Iterate through shape files in the "topology.tpl" file until // end or max. file number reached char *line; while (!files.full() && (line = reader.read()) != NULL) { // Line format: filename,range,icon,field,r,g,b,pen_width,label_range,important_range // Ignore comments (lines starting with *) and empty lines if (StringIsEmpty(line) || line[0] == '*') continue; // Find first comma to extract shape filename char *p = strchr(line, ','); if (p == NULL || p == line) // If no comma was found -> ignore this line/shapefile continue; if (HasLittleMemory()) { /* hard-coded blacklist for huge files on PPC2000; those devices usually have very little memory */ // Null-terminate the line string after the first comma // for strcmp() calls in IsHugeTopographyFile() function *p = 0; // Skip large topography files if (IsHugeTopographyFile(line)) continue; } // Extract filename and append it to the shape_filename buffer memcpy(shape_filename_end, line, p - line); // Append ".shp" file extension to the shape_filename buffer strcpy(shape_filename_end + (p - line), ".shp"); // Parse shape range fixed shape_range = fixed(strtod(p + 1, &p)) * 1000; if (*p != _T(',')) continue; // Parse shape icon id long shape_icon = strtol(p + 1, &p, 10); if (*p != _T(',')) continue; // Parse shape field for text display long shape_field = strtol(p + 1, &p, 10) - 1; if (*p != _T(',')) continue; // Parse red component of line / shading colour uint8_t red = (uint8_t)strtol(p + 1, &p, 10); if (*p != _T(',')) continue; // Parse green component of line / shading colour uint8_t green = (uint8_t)strtol(p + 1, &p, 10); if (*p != _T(',')) continue; // Parse blue component of line / shading colour uint8_t blue = (uint8_t)strtol(p + 1, &p, 10); // Parse pen width of lines int pen_width=1; if (*p == _T(',')) { pen_width = strtol(p + 1, &p, 10); if (pen_width<0) pen_width=1; else if (pen_width>31) pen_width=31; } // Parse range for displaying labels fixed label_range = shape_range; if (*p == _T(',')) label_range = fixed(strtod(p + 1, &p)) * 1000; // Parse range for displaying labels with "important" rendering style fixed labelImportantRange = fixed_zero; if (*p == _T(',')) labelImportantRange = fixed(strtod(p + 1, &p)) * 1000; // Create TopographyFile instance from parsed line TopographyFile *file = new TopographyFile(zdir, shape_filename, shape_range, label_range, labelImportantRange, Color(red, green, blue), shape_field, shape_icon, pen_width); if (file->IsEmpty()) // If the shape file could not be read -> skip this line/file delete file; else // .. otherwise append it to our list of shape files files.append(file); // Update progress bar operation.SetProgressPosition((reader.tell() * 100) / filesize); } }