mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Iterator and looping cleanup in Ascii input reader
This commit is contained in:
parent
510dd1cf71
commit
a0cc34efb2
1 changed files with 32 additions and 33 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue