Iterator and looping cleanup in Ascii input reader

This commit is contained in:
Tim Wojtulewicz 2022-07-19 09:58:31 -07:00
parent 510dd1cf71
commit a0cc34efb2

View file

@ -83,26 +83,25 @@ bool Ascii::DoInit(const ReaderInfo& info, int num_fields, const Field* const* f
BifConst::InputAscii::path_prefix->Len()); BifConst::InputAscii::path_prefix->Len());
// Set per-filter configuration options. // Set per-filter configuration options.
for ( ReaderInfo::config_map::const_iterator i = info.config.begin(); i != info.config.end(); for ( const auto& [k, v] : info.config )
i++ )
{ {
if ( strcmp(i->first, "separator") == 0 ) if ( strcmp(k, "separator") == 0 )
separator.assign(i->second); separator.assign(v);
else if ( strcmp(i->first, "set_separator") == 0 ) else if ( strcmp(k, "set_separator") == 0 )
set_separator.assign(i->second); set_separator.assign(v);
else if ( strcmp(i->first, "empty_field") == 0 ) else if ( strcmp(k, "empty_field") == 0 )
empty_field.assign(i->second); empty_field.assign(v);
else if ( strcmp(i->first, "unset_field") == 0 ) else if ( strcmp(k, "unset_field") == 0 )
unset_field.assign(i->second); unset_field.assign(v);
else if ( strcmp(i->first, "fail_on_invalid_lines") == 0 ) else if ( strcmp(k, "fail_on_invalid_lines") == 0 )
fail_on_invalid_lines = (strncmp(i->second, "T", 1) == 0); fail_on_invalid_lines = (strncmp(v, "T", 1) == 0);
else if ( strcmp(i->first, "fail_on_file_problem") == 0 ) else if ( strcmp(k, "fail_on_file_problem") == 0 )
fail_on_file_problem = (strncmp(i->second, "T", 1) == 0); fail_on_file_problem = (strncmp(v, "T", 1) == 0);
} }
if ( separator.size() != 1 ) if ( separator.size() != 1 )
@ -206,11 +205,13 @@ bool Ascii::ReadHeader(bool useCached)
// printf("Updating fields from description %s\n", line.c_str()); // printf("Updating fields from description %s\n", line.c_str());
columnMap.clear(); columnMap.clear();
const auto* fields = Fields();
for ( int i = 0; i < NumFields(); i++ ) for ( int i = 0; i < NumFields(); i++ )
{ {
const Field* field = Fields()[i]; const Field* field = fields[i];
map<string, uint32_t>::iterator fit = ifields.find(field->name); auto fit = ifields.find(field->name);
if ( fit == ifields.end() ) if ( fit == ifields.end() )
{ {
if ( field->optional ) if ( field->optional )
@ -231,11 +232,11 @@ bool Ascii::ReadHeader(bool useCached)
return false; return false;
} }
FieldMapping f(field->name, field->type, field->subtype, ifields[field->name]); FieldMapping f(field->name, field->type, field->subtype, static_cast<int>(ifields[field->name]));
if ( field->secondary_name && strlen(field->secondary_name) != 0 ) if ( field->secondary_name && strlen(field->secondary_name) != 0 )
{ {
map<string, uint32_t>::iterator fit2 = ifields.find(field->secondary_name); auto fit2 = ifields.find(field->secondary_name);
if ( fit2 == ifields.end() ) if ( fit2 == ifields.end() )
{ {
FailWarn(fail_on_file_problem, FailWarn(fail_on_file_problem,
@ -246,7 +247,7 @@ bool Ascii::ReadHeader(bool useCached)
return false; return false;
} }
f.secondary_position = ifields[field->secondary_name]; f.secondary_position = static_cast<int>(ifields[field->secondary_name]);
} }
columnMap.push_back(f); columnMap.push_back(f);
@ -266,7 +267,7 @@ bool Ascii::GetLine(string& str)
read_location->last_line++; read_location->last_line++;
} }
if ( ! str.size() ) if ( str.empty() )
continue; continue;
if ( str.back() == '\r' ) // deal with \r\n by removing \r if ( str.back() == '\r' ) // deal with \r\n by removing \r
@ -384,28 +385,26 @@ bool Ascii::DoUpdate()
Value** fields = new Value*[NumFields()]; Value** fields = new Value*[NumFields()];
int fpos = 0; int fpos = 0;
for ( vector<FieldMapping>::iterator fit = columnMap.begin(); fit != columnMap.end(); for ( const auto& fit : columnMap )
fit++ )
{ {
if ( ! fit.present )
if ( ! fit->present )
{ {
// add non-present field // add non-present field
fields[fpos] = new Value((*fit).type, false); fields[fpos] = new Value(fit.type, false);
if ( read_location ) if ( read_location )
fields[fpos]->SetFileLineNumber(read_location->first_line); fields[fpos]->SetFileLineNumber(read_location->first_line);
fpos++; fpos++;
continue; continue;
} }
assert(fit->position >= 0); assert(fit.position >= 0);
if ( (*fit).position > pos || (*fit).secondary_position > pos ) if ( fit.position > pos || fit.secondary_position > pos )
{ {
FailWarn(fail_on_invalid_lines, Fmt("Not enough fields in line '%s' of %s. Found " FailWarn(fail_on_invalid_lines, Fmt("Not enough fields in line '%s' of %s. Found "
"%d fields, want positions %d and %d", "%d fields, want positions %d and %d",
line.c_str(), fname.c_str(), pos, line.c_str(), fname.c_str(), pos, fit.position,
(*fit).position, (*fit).secondary_position)); fit.secondary_position));
if ( fail_on_invalid_lines ) if ( fail_on_invalid_lines )
{ {
@ -423,8 +422,8 @@ bool Ascii::DoUpdate()
} }
} }
Value* val = formatter->ParseValue(stringfields[(*fit).position], (*fit).name, Value* val = formatter->ParseValue(stringfields[fit.position], fit.name, fit.type,
(*fit).type, (*fit).subtype); fit.subtype);
if ( ! val ) if ( ! val )
{ {
Warning(Fmt("Could not convert line '%s' of %s to Val. Ignoring line.", Warning(Fmt("Could not convert line '%s' of %s to Val. Ignoring line.",
@ -436,14 +435,14 @@ bool Ascii::DoUpdate()
if ( read_location ) if ( read_location )
val->SetFileLineNumber(read_location->first_line); val->SetFileLineNumber(read_location->first_line);
if ( (*fit).secondary_position != -1 ) if ( fit.secondary_position != -1 )
{ {
// we have a port definition :) // we have a port definition :)
assert(val->type == TYPE_PORT); assert(val->type == TYPE_PORT);
// Error(Fmt("Got type %d != PORT with secondary position!", val->type)); // Error(Fmt("Got type %d != PORT with secondary position!", val->type));
val->val.port_val.proto = formatter->ParseProto( val->val.port_val.proto = formatter->ParseProto(
stringfields[(*fit).secondary_position]); stringfields[fit.secondary_position]);
} }
fields[fpos] = val; fields[fpos] = val;