#include #include #include #include "linecut.h" #include "error.h" void verify (data_t *gl, file_entry_t *queue) { file_entry_t *current; for (current = queue; current; current = current->next) { unsigned int i; long lines; gl->file = current->file; if (!gl->read_from_stdin) { gl->input = xfopen (gl->file, "r"); lines = count_lines (gl->input); } else lines = map_stdin_lines (gl); current->lines = lines; for (i = 0; gl->ranges[i]; i++) { long start_range = gl->ranges[i][0]; long end_range = gl->ranges[i][1]; if ((start_range > lines) || (end_range > lines)) error ("%s: %s", gl->file, range_errors[ERR_EXCEEDS_TOTAL_LINES]); range_to_absolute (lines, &start_range); range_to_absolute (lines, &end_range); if ((start_range < 0) || (end_range < 0)) error ("%s: %s", gl->file, range_errors[ERR_OFFSET_EXCEEDS_BOUNDARY]); if ((start_range == 0) || (end_range == 0)) error ("%s: %s", gl->file, range_errors[ERR_MUST_NOT_BE_NULL]); if ((start_range > lines) || (end_range > lines)) error ("%s: %s", gl->file, range_errors[ERR_EXCEEDS_TOTAL_LINES]); } if (!gl->read_from_stdin) xfclose (gl->file, gl->input); } } void extract (data_t *gl, file_entry_t *queue) { file_entry_t *current; for (current = queue; current; current = current->next) { unsigned int i; long lines; fpos_t *offset_map; gl->file = current->file; if (!gl->read_from_stdin) gl->input = xfopen (gl->file, "r"); if (gl->number_lines) fprintf (stdout, "==> %s\n", gl->file); gl->lines_count = lines = current->lines; if (!gl->read_from_stdin) offset_map = build_offset_map (gl); for (i = 0; gl->ranges[i]; i++) { long range_start = gl->ranges[i][0]; long range_end = gl->ranges[i][1]; range_to_absolute (lines, &range_start); range_to_absolute (lines, &range_end); if (!gl->read_from_stdin) { seek_to_offset (gl, offset_map, range_start - 1); extract_range_file (gl, range_start, range_end); } else extract_range_stdin (gl, range_start, range_end); } if (!gl->read_from_stdin) { xfree (offset_map); xfclose (gl->file, gl->input); } } }