aboutsummaryrefslogtreecommitdiff
path: root/files.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2021-01-18 15:24:10 -0800
committerBruce Hill <bruce@bruce-hill.com>2021-01-18 15:24:10 -0800
commitb8bb6c25ecafc3398bbaa949398b80c4e1bce373 (patch)
treece444f12f21e7b9a983535a0a6edc0551f4773f0 /files.c
parent060ace366b5a45bffff58608b5e8290b3c9fa647 (diff)
Finally got around to implementing binary search for line numbers
Diffstat (limited to 'files.c')
-rw-r--r--files.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/files.c b/files.c
index 414057c..c554371 100644
--- a/files.c
+++ b/files.c
@@ -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
}
//