@@ -2231,7 +2231,7 @@ external_log_format::scan_tabular(logfile& lf,
22312231 auto sf = sbr.to_string_fragment ();
22322232 if (this ->lf_specialized ) {
22332233 auto & ll = dst.back ();
2234- if (dst. size () <= this ->tlf_header_lines ) {
2234+ if (li. li_file_range . fr_offset < this ->tlf_header_end ) {
22352235 // ignore header
22362236 ll.set_ignore (true );
22372237 return scan_match{1000 };
@@ -2318,10 +2318,9 @@ external_log_format::scan_tabular(logfile& lf,
23182318 }
23192319 if (value_index >= this ->elf_value_def_read_order .size ()) {
23202320 this ->finalize_line (dst.back (), lfi, sbc);
2321+ } else if (sf.startswith (" #" )) {
2322+ ll.set_ignore (true );
23212323 } else {
2322- if (sf.startswith (" #" )) {
2323- ll.set_ignore (true );
2324- }
23252324 ll.set_level (LEVEL_INVALID );
23262325 }
23272326
@@ -2338,7 +2337,7 @@ external_log_format::scan_tabular(logfile& lf,
23382337
23392338 auto header_state = tabular_header_state::reading_metadata;
23402339 std::optional<char > sep;
2341- for (auto ll_iter = dst .begin (); ll_iter != dst .end (); ++ll_iter) {
2340+ for (auto ll_iter = lf .begin (); ll_iter != lf .end (); ++ll_iter) {
23422341 auto read_res = lf.read_line (ll_iter);
23432342 if (read_res.isErr ()) {
23442343 return scan_no_match{" cannot read header" };
@@ -2356,17 +2355,11 @@ external_log_format::scan_tabular(logfile& lf,
23562355 return scan_error{" sep= hint missing separator character" };
23572356 }
23582357 sep = sep_sf.data ()[0 ];
2359- ll_iter->set_time (std::chrono::microseconds::zero ());
2360- ll_iter->set_level (LEVEL_UNKNOWN );
2361- ll_iter->set_ignore (true );
23622358 log_info (" %ld:found 'sep=' header: %x" ,
23632359 std::distance (dst.begin (), ll_iter),
23642360 sep.value ());
23652361 } else if (hdr_sf.startswith (" #" )) {
2366- ll_iter->set_time (std::chrono::microseconds::zero ());
2367- ll_iter->set_level (LEVEL_UNKNOWN );
2368- ll_iter->set_ignore (true );
2369- log_info (" %ld:ignoring comment -- %.*s" ,
2362+ log_info (" %ld:comment header -- %.*s" ,
23702363 std::distance (dst.begin (), ll_iter),
23712364 hdr_sf.length (),
23722365 hdr_sf.data ());
@@ -2382,10 +2375,6 @@ external_log_format::scan_tabular(logfile& lf,
23822375 ss.ss_separator = sep.value ();
23832376 uint32_t hits = 0 , misses = 0 ;
23842377
2385- log_info (" %ld:found header -- %.*s" ,
2386- std::distance (dst.begin (), ll_iter),
2387- hdr_sf.length (),
2388- hdr_sf.data ());
23892378 this ->elf_value_def_read_order .clear ();
23902379 for (auto hdr_name : ss) {
23912380 auto value_iter
@@ -2403,13 +2392,25 @@ external_log_format::scan_tabular(logfile& lf,
24032392 if (hits <= 2 ) {
24042393 return scan_no_match{" not enough columns matched" };
24052394 }
2395+
2396+ for (auto prev_iter = dst.begin (); prev_iter != ll_iter;
2397+ ++prev_iter)
2398+ {
2399+ prev_iter->set_time (std::chrono::microseconds::zero ());
2400+ prev_iter->set_level (LEVEL_UNKNOWN );
2401+ prev_iter->set_ignore (true );
2402+ }
2403+
2404+ log_info (" %ld:found column header -- %.*s" ,
2405+ std::distance (dst.begin (), ll_iter),
2406+ hdr_sf.length (),
2407+ hdr_sf.data ());
2408+
24062409 header_state = tabular_header_state::have_column_header;
2407- auto & ll = dst.back ();
2408- ll.set_ignore (true );
2409- ll.set_level (LEVEL_INVALID );
2410+ ll_iter->set_ignore (true );
2411+ ll_iter->set_level (LEVEL_INVALID );
24102412 this ->tlf_separator = sep.value ();
2411- this ->tlf_header_lines
2412- = std::distance (dst.begin (), ll_iter) + 1 ;
2413+ this ->tlf_header_end = li.li_file_range .next_offset ();
24132414 return scan_match{1000 , misses, hits};
24142415 }
24152416 }
@@ -4893,7 +4894,6 @@ external_log_format::build(std::vector<lnav::console::user_message>& errors)
48934894 yajl_config (
48944895 this ->jlf_yajl_handle .get (), yajl_dont_validate_strings, 1 );
48954896 } else if (this ->elf_type == elf_type_t ::ELF_TYPE_TABULAR ) {
4896- this ->lf_multiline = false ;
48974897 this ->lf_structured = true ;
48984898 }
48994899 } else {
0 commit comments