diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2021-01-18 15:24:10 -0800 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2021-01-18 15:24:10 -0800 |
| commit | b8bb6c25ecafc3398bbaa949398b80c4e1bce373 (patch) | |
| tree | ce444f12f21e7b9a983535a0a6edc0551f4773f0 | |
| parent | 060ace366b5a45bffff58608b5e8290b3c9fa647 (diff) | |
Finally got around to implementing binary search for line numbers
| -rw-r--r-- | files.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -159,12 +159,18 @@ void destroy_file(file_t **f) // size_t get_line_number(file_t *f, const char *p) { - // TODO: binary search - for (size_t n = 1; n < f->nlines; n++) { - if (f->lines[n] > p) - return n; + // Binary search: + size_t lo = 0, hi = f->nlines-1; + while (lo <= hi) { + size_t mid = (lo + hi) / 2; + if (f->lines[mid] == p) + return mid + 1; + else if (f->lines[mid] < p) + lo = mid + 1; + else if (f->lines[mid] > p) + hi = mid - 1; } - return f->nlines; + return lo; // Return the line number whose line starts closest before p } // |
